利用T4模板生成ASP.NET Core控制器的构造函数和参数

前言

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

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

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

CtrlNames.txt文件内容:

Values
Account

CtrlTemplate.tt代码:

 1 <#@ template language="C#" debug="false" hostspecific="true"#>
 2 <#@ assembly name="System.Core" #>
 3 <#@ import namespace="System.Linq" #>
 4 <#@ import namespace="System.Text" #>
 5 <#@ import namespace="System.Collections.Generic" #>
 6 <#@ output extension=".cs" #>
 7 using ApiCoreTest;
 8 using EFDbContext;
 9 using Microsoft.AspNetCore.Mvc;
10 using Microsoft.Extensions.Logging;
11 using Microsoft.Extensions.Options;
12
13 namespace ApiCoreTest.Controllers
14 {
15 <#
16     //获取项目的根目录
17     var solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)");
18     //获取配置文件
19     var lines = System.IO.File.ReadAllLines(solutionsPath + @"/src/ApiCoreTest/Controllers/Template/CtrlNames.txt");
20     foreach(var name in lines)
21     {#>
22     public partial class <#= name#>Controller : Controller
23     {
24         IOptions<ConfigModel> _config;
25         ILogger<<#= name#>Controller> _logger;
26         ApplicationDbContext _db;
27         public <#= name#>Controller(IOptions<ConfigModel> config, ILogger<<#= name#>Controller> logger, ApplicationDbContext db)
28         {
29             _config = config;
30             _logger = logger;
31             _db = db;
32         }
33     }
34 <#}#>
35 }

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

 1 using ApiCoreTest;
 2 using EFDbContext;
 3 using Microsoft.AspNetCore.Mvc;
 4 using Microsoft.Extensions.Logging;
 5 using Microsoft.Extensions.Options;
 6
 7 namespace ApiCoreTest.Controllers
 8 {
 9     public partial class ValuesController : Controller
10     {
11         IOptions<ConfigModel> _config;
12         ILogger<ValuesController> _logger;
13         ApplicationDbContext _db;
14         public ValuesController(IOptions<ConfigModel> config, ILogger<ValuesController> logger, ApplicationDbContext db)
15         {
16             _config = config;
17             _logger = logger;
18             _db = db;
19         }
20     }
21     public partial class AccountController : Controller
22     {
23         IOptions<ConfigModel> _config;
24         ILogger<AccountController> _logger;
25         ApplicationDbContext _db;
26         public AccountController(IOptions<ConfigModel> config, ILogger<AccountController> logger, ApplicationDbContext db)
27         {
28             _config = config;
29             _logger = logger;
30             _db = db;
31         }
32     }
33 }

使用了模板的控制器:

 1 namespace ApiCoreTest.Controllers
 2 {
 3     [Route("api/[controller]")]
 4     public partial class ValuesController : Controller
 5     {
 6         [HttpGet]
 7         public string Gets()
 8         {
 9             var val = JsonConvert.SerializeObject(_config.Value);
10             _logger.LogDebug(val);
11             return val;
12         }
13     }
14 }
 1 namespace ApiCoreTest.Controllers
 2 {
 3     public partial class AccountController : Controller
 4     {
 5         public IActionResult Test()
 6         {
 7             var val = JsonConvert.SerializeObject(_config.Value);
 8             _logger.LogDebug(val);
 9             return Content(val);
10         }
11     }
12 }

注意

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

时间: 2024-12-26 21:24:47

利用T4模板生成ASP.NET Core控制器的构造函数和参数的相关文章

轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码

FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.Model 利用T4模板,[MultipleOutputHelper.ttinclude]批量生成多文件 基本语法: 1. 初始化:获取MultipleOutputHelper.ttinclude文件模板 在T4模板导入 //导入MultipleOutputHelper.ttinclude文件 路径 <#@include file="$(SolutionDir)\ORM.Model\T4\Mult

七色花基本权限系统(5)- 实体配置的使用和利用T4自动生成实体配置

在前面的章节里,用户表的结构非常简单,没有控制如何映射到数据库.通常,需要对字段的长度.是否可为空甚至特定数据类型进行设置,因为EntityFramework的默认映射规则相对而言比较简单和通用.在这篇日志里,将演示如何对数据实体进行映射配置,并利用T4模板自动创建映射配置类文件. 配置方式 EntityFramework的实体映射配置有2种. 第一种是直接在实体类中以特性的方式进行控制,这些特性有部分是EF实现的,也有部分是非EF实现的.也就是说,在数据实体层不引用EF的情况下,只能使用不全的

[转]MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码

本文转自:http://www.cnblogs.com/guomingfeng/p/mvc-ef-t4.html 〇.目录 一.前言 二.工具准备 三.T4代码生成预热 (一) 单文件生成:HelloWorld.cs (二) 多文件生成 四.生成数据层实体相关相似代码 (一) 生成准备 (二) 生成实体相关相似代码 生成实体映射配置类 生成实体仓储接口 生成实体仓储实现 五.源码获取 系列导航 一.前言 经过前面EF的<第一篇>与<第二篇>,我们的数据层功能已经较为完善了,但有不少

使用T4模板生成不同部署环境下的配置文件

在开发企业级应用的时候,通常会有不同的开发环境,比如有开发环境,测试环境,正式环境,生产环境等.在一份代码部署到不同环境的时候,不同环境的配置文件可能需要根据目标环境不同而不同.比如在开发环境中,数据库使用的是开发环境的数据库,消息队列也使用的部署在开发机上的消息队列,传统的方式是,由发布或者配置管理员来维护这些不同环境的配置文件.通常,手工的针对不同的环境去修改配置文件容易产生错误. 有很多种不同的方式来针对不同的部署环境生成配置,最笨的方法就是可以维护几套不同的配置文件,然后在编译事件中根据

t4模板生成 _references.js 文件

t4模板功能: 指定目录,自动生成 _references.js 文件 相关文件说明: _references.js 实现js智能提示. 注意事项: hostspecific="true" <#@ template debug="false" hostspecific="true" language="C#" #> projectDir=Host.ResolveAssemblyReference("$(P

Visual Studio 2013 EF5实体数据模型 EDMX 使用 T4模板生成后使用 ObjectContext对象

Visual Studio 2013 EF5实体数据模型 EDMX 使用 T4模板生成后的继承对象为DbContext,以前的熟悉的ObjectContext对象不见了,当然使用ObjectContext对象不是每个程序员都需要的,解决办法有两种: 方法1.打开Model.Context.cs,添加 public OracleModelEntities(ObjectContext objectContext, bool dbContextOwnsObjectContext)           

利用html模板生成Word文件(服务器端不需要安装Word)

利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端的方法来实现,经过测试这种方法也是一种不错的选择! 首先自己写一个html网页模板,代码如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>

使用T4模板生成代码的学习

之前做项目使用的都是Db First,直接在项目中添加Entity Framework,使用T4模板(T4模板引擎之基础入门)生成DAL BLL层等(T4模板是一个同事给的,也没有仔细研究,代码如下:) <#@ template language="C#" debug="false" hostspecific="true"#> <#@ include file="EF.Utility.CS.ttinclude"

使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你创建良好的文档和帮助页面. Swashbuckle 可以通过修改 Startup.cs 作为一组 NuGet 包方便的加入项目.Swashbuckle 是一个开源项目,为使用 ASP.NET Core MVC 构建的 Web APIs 生成 Swagger 文档.Swagger 是一个机器可读的 R