利用T4模板生成ASP.NET Core控制器的构造函数和参数
2024-10-19 01:21:09
前言
在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模板的控制器必须设置为分部类,而且命名空间要一致。
最新文章
- kafka主题offset各种需求修改方法
- 设计模式(四)抽象工厂模式(Abstract Factory Pattern)
- Razor 视图引擎 &ndash; ASP.NET MVC 4 系列
- core java 1~4(HelloWorld &; 标识符|关键字|数据类型 &; 表达式|流程控制 &; 数组)
- C#学习笔记之线程 - 通知Signal
- 《C#并行编程高级教程》第2章 命令式编程 笔记
- UGUI Button控件
- Android Every day a new function:one
- java序列化是什么和反序列化和hadoop序列化
- iptables命令 高级网络
- Bable实现由ES6转译为ES5
- DTCC2019第十届中国数据库技术大会将于5月在北京召开
- SpringBoot 之 MVC
- PHP 设置调试工具XDebug PHPStorm IDE
- 【BZOJ】1187: [HNOI2007]神奇游乐园
- streamdataio 实时数据分发平台
- python之type
- Java的历史及发展
- Prism 4 文档 ---第3章 管理组件间的依赖关系
- tcp.cc
热门文章
- JavaScript思维导图—数组
- java.sql.SQLException: No suitable driver 问题解决
- 上学时的HTML+JS+CSS(小总结)
- 微信分享调用 -- c#篇
- 爱上MVC~为DisplayNameFor添加扩展,支持PagedList集合
- atitit &#160;opencv apiattilax总结&#160;约500个函数 .xlsx
- jQuery学习-打字游戏
- 学习Data Science/Deep Learning的一些材料
- 利用CSS3 clip-path裁剪各种图形。
- Nokia Lumia通过电脑来升级Windows Phone 8.1