配色: 字号:
利用T4模板生成ASP.NET Core控制器的构造函数和参数
2016-12-10 | 阅:  转:  |  分享 
  
利用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模板的控制器必须设置为分部类,而且命名空间要一致。

献花(0)
+1
(本文系thedust79首藏)