利用T4模板生成ASP.NETCore控制器的构造函数和参数
在ASP.NETCore中引入了DI,并且通过构造函数注入参数,控制器中会大量使用DI注入各种的配置参数,如果配置注入的参数比较多,而且各个控制器需要的配置参数都基本一样的话,那么不断重复的复制黏贴代码提供相应的构造函数,效率低效也,因此使用T4模板生成控制器的构造函数,这也得益于C#对分部类(partial)的支持。
CtrlNames.txt文件内容:
Values
Account
CtrlTemplate.tt代码:
复制代码
1<#@templatelanguage="C#"debug="false"hostspecific="true"#>
2<#@assemblyname="System.Core"#>
3<#@importnamespace="System.Linq"#>
4<#@importnamespace="System.Text"#>
5<#@importnamespace="System.Collections.Generic"#>
6<#@outputextension=".cs"#>
7usingApiCoreTest;
8usingEFDbContext;
9usingMicrosoft.AspNetCore.Mvc;
10usingMicrosoft.Extensions.Logging;
11usingMicrosoft.Extensions.Options;
12
13namespaceApiCoreTest.Controllers
14{
15<#
16//获取项目的根目录
17varsolutionsPath=Host.ResolveAssemblyReference("$(SolutionDir)");
18//获取配置文件
19varlines=System.IO.File.ReadAllLines(solutionsPath+@"/src/ApiCoreTest/Controllers/Template/CtrlNames.txt");
20foreach(varnameinlines)
21{#>
22publicpartialclass<#=name#>Controller:Controller
23{
24IOptions_config;
25ILogger<<#=name#>Controller>_logger;
26ApplicationDbContext_db;
27public<#=name#>Controller(IOptionsconfig,ILogger<<#=name#>Controller>logger,ApplicationDbContextdb)
28{
29_config=config;
30_logger=logger;
31_db=db;
32}
33}
34<#}#>
35}
复制代码
模板生成的文件CtrlTemplate.cs内容:
复制代码
1usingApiCoreTest;
2usingEFDbContext;
3usingMicrosoft.AspNetCore.Mvc;
4usingMicrosoft.Extensions.Logging;
5usingMicrosoft.Extensions.Options;
6
7namespaceApiCoreTest.Controllers
8{
9publicpartialclassValuesController:Controller
10{
11IOptions_config;
12ILogger_logger;
13ApplicationDbContext_db;
14publicValuesController(IOptionsconfig,ILoggerlogger,ApplicationDbContextdb)
15{
16_config=config;
17_logger=logger;
18_db=db;
19}
20}
21publicpartialclassAccountController:Controller
22{
23IOptions_config;
24ILogger_logger;
25Applicationwww.baiyuewang.netDbContext_db;
26publicAccountController(IOptionsconfig,ILoggerlogger,ApplicationDbContextdb)
27{
28_config=config;
29_logger=logger;
30_db=db;
31}
32}
33}
复制代码
使用了模板的控制器:
复制代码
1namespaceApiCoreTest.Controllers
2{
3[Route("api/[controller]")]
4publicpartialclassValuesController:Controller
5{
6[HttpGet]
7publicstringGets()
8{
9varval=JsonConvert.SerializeObject(_config.Value);
10_logger.LogDebug(val);
11returnval;
12}
13}
14}
复制代码
复制代码
1namespaceApiCoreTest.Controllers
2{
3publicpartialclassAccountController:Controller
4{
5publicIActionResultTest()
6{
7varval=JsonConvert.SerializeObject(_config.Value);
8_logger.LogDebug(val);
9returnContent(val);
10}
11}
12}
复制代码
注意
使用了T4模板的控制器必须设置为分部类,而且命名空间要一致。
|
|