前言

在ASP.NET Core中引入了DI,并且通过构造函数注入参数,控制器中会大量使用DI注入各种的配置参数,如果配置注入的参数比较多,而且各个控制器需要的配置参数都基本一样的话,那么不断重复的复制黏贴代码提供相应的构造函数,效率低效也,因此使用T4模板生成控制器的构造函数 ,这也得益于C#对分部类(partial)的支持。

T4模板生成控制器构造函数

图中CtrlTemplate.tt为模板文件,CtrlNames.txt为需要使用T4生成代码的控制器名称文件,CtrlTemplate.cs为T4模板生成的文件。

CtrlNames.txt文件内容:

Values
Account

CtrlTemplate.tt代码:

 <#@ template language="C#" debug="false" hostspecific="true"#>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
using ApiCoreTest;
using EFDbContext;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; namespace ApiCoreTest.Controllers
{
<#
//获取项目的根目录
var solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");
//获取配置文件
var lines = System.IO.File.ReadAllLines(solutionsPath + @"/src/ApiCoreTest/Controllers/Template/CtrlNames.txt");
foreach(var name in lines)
{#>
public partial class <#= name#>Controller : Controller
{
IOptions<ConfigModel> _config;
ILogger<<#= name#>Controller> _logger;
ApplicationDbContext _db;
public <#= name#>Controller(IOptions<ConfigModel> config, ILogger<<#= name#>Controller> logger, ApplicationDbContext db)
{
_config = config;
_logger = logger;
_db = db;
}
}
<#}#>
}

模板生成的文件CtrlTemplate.cs 内容:

 using ApiCoreTest;
using EFDbContext;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; namespace ApiCoreTest.Controllers
{
public partial class ValuesController : Controller
{
IOptions<ConfigModel> _config;
ILogger<ValuesController> _logger;
ApplicationDbContext _db;
public ValuesController(IOptions<ConfigModel> config, ILogger<ValuesController> logger, ApplicationDbContext db)
{
_config = config;
_logger = logger;
_db = db;
}
}
public partial class AccountController : Controller
{
IOptions<ConfigModel> _config;
ILogger<AccountController> _logger;
ApplicationDbContext _db;
public AccountController(IOptions<ConfigModel> config, ILogger<AccountController> logger, ApplicationDbContext db)
{
_config = config;
_logger = logger;
_db = db;
}
}
}

使用了模板的控制器:

 namespace ApiCoreTest.Controllers
{
[Route("api/[controller]")]
public partial class ValuesController : Controller
{
[HttpGet]
public string Gets()
{
var val = JsonConvert.SerializeObject(_config.Value);
_logger.LogDebug(val);
return val;
}
}
}
 namespace ApiCoreTest.Controllers
{
public partial class AccountController : Controller
{
public IActionResult Test()
{
var val = JsonConvert.SerializeObject(_config.Value);
_logger.LogDebug(val);
return Content(val);
}
}
}

注意

使用了T4模板的控制器必须设置为分部类,而且命名空间要一致。

最新文章

  1. kafka主题offset各种需求修改方法
  2. 设计模式(四)抽象工厂模式(Abstract Factory Pattern)
  3. Razor 视图引擎 &ndash; ASP.NET MVC 4 系列
  4. core java 1~4(HelloWorld &amp; 标识符|关键字|数据类型 &amp; 表达式|流程控制 &amp; 数组)
  5. C#学习笔记之线程 - 通知Signal
  6. 《C#并行编程高级教程》第2章 命令式编程 笔记
  7. UGUI Button控件
  8. Android Every day a new function:one
  9. java序列化是什么和反序列化和hadoop序列化
  10. iptables命令 高级网络
  11. Bable实现由ES6转译为ES5
  12. DTCC2019第十届中国数据库技术大会将于5月在北京召开
  13. SpringBoot 之 MVC
  14. PHP 设置调试工具XDebug PHPStorm IDE
  15. 【BZOJ】1187: [HNOI2007]神奇游乐园
  16. streamdataio 实时数据分发平台
  17. python之type
  18. Java的历史及发展
  19. Prism 4 文档 ---第3章 管理组件间的依赖关系
  20. tcp.cc

热门文章

  1. JavaScript思维导图—数组
  2. java.sql.SQLException: No suitable driver 问题解决
  3. 上学时的HTML+JS+CSS(小总结)
  4. 微信分享调用 -- c#篇
  5. 爱上MVC~为DisplayNameFor添加扩展,支持PagedList集合
  6. atitit &#160;opencv apiattilax总结&#160;约500个函数 .xlsx
  7. jQuery学习-打字游戏
  8. 学习Data Science/Deep Learning的一些材料
  9. 利用CSS3 clip-path裁剪各种图形。
  10. Nokia Lumia通过电脑来升级Windows Phone 8.1