前言

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

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

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

CtrlNames.txt文件内容:

  1. Values
  2. 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模板的控制器必须设置为分部类,而且命名空间要一致。

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

  1. 【VS外接程序】利用T4模板生成模块代码

    引言 记得第一次做asp.net mvc项目时,可以用model直接生成Html的增删改查页面, 没什么特殊要求都可以不用修改直接用了, 觉得很神奇,效率太高了.后来在做客户端开发时,发现很多模块都是 ...

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

    FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.Model 利用T4模板,[MultipleOutputHelper.ttinclude]批量生成多文件 ...

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

    在开发企业级应用的时候,通常会有不同的开发环境,比如有开发环境,测试环境,正式环境,生产环境等.在一份代码部署到不同环境的时候,不同环境的配置文件可能需要根据目标环境不同而不同.比如在开发环境中,数据 ...

  4. CSharpGL(12)用T4模板生成CSSL及其renderer代码

    CSharpGL(12)用T4模板生成CSSL及其renderer代码 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立 ...

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

    前言 经过前面EF的<第一篇>与<第二篇>,我们的数据层功能已经较为完善了,但有不少代码相似度较高,比如负责实体映射的 EntityConfiguration,负责仓储操作的I ...

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

    使用T4模板生成不同部署环境下的配置文件 在开发企业级应用的时候,通常会有不同的开发环境,比如有开发环境,测试环境,正式环境,生产环境等.在一份代码部署到不同环境的时候,不同环境的配置文件可能需要根据 ...

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

    本文转自:http://www.cnblogs.com/guomingfeng/p/mvc-ef-t4.html 〇.目录 一.前言 二.工具准备 三.T4代码生成预热 (一) 单文件生成:Hello ...

  8. 使用T4模板生成MySql数据库实体类

    注:本文系作者原创,但可随意转载. 现在呆的公司使用的数据库几乎都是MySQL.编程方式DatabaseFirst.即先写数据库设计,表设计按照规范好的文档写进EXCEL里,然后用公司的宏,生成建表脚 ...

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

    Visual Studio 2013 EF5实体数据模型 EDMX 使用 T4模板生成后的继承对象为DbContext,以前的熟悉的ObjectContext对象不见了,当然使用ObjectConte ...

随机推荐

  1. iOS——Core Animation 知识摘抄(四)

    原文地址http://www.cocoachina.com/ios/20150106/10840.html 延迟解压 一旦图片文件被加载就必须要进行解码,解码过程是一个相当复杂的任务,需要消耗非常长的 ...

  2. Java线程:线程状态的转换

    Java线程:线程状态的转换   一.线程状态   线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下:   1.新状态:线程对象已 ...

  3. salesforce 零基础开发入门学习(七)PickList的value值获取

    之前介绍过PickList类型的声明以及赋值,但是如何取出呢?一个sObject对象可以理解为一条数据.通过sObject直接取恐怕很难做到,因为他只会显示一个值.这时候就要用到Schema命名空间中 ...

  4. javascript_core_09之继承、属性、对象

    1.OOP之修改继承: ①child._proto_=father:=>Object.setPrototypeOf(child,father):每次只能修改一个对象的父对象: ②构造函数.pro ...

  5. MongoDB修改器的使用2

    1."$inc"的使用 主要用来增加数值,比如网站的访问量,点击量,流量等 db.games.insert({game:"pinball",user:" ...

  6. TSql HierarchyID 数据类型用法

    HierarchyID 数据类型是一种长度可变的系统数据类型.可使用 HierarchyID 表示层次结构中的位置.类型为 HierarchyID 的列不会自动表示树,由应用程序来生成和分配 Hier ...

  7. 浏览器兼容处理(HTML条件注释、CSSHack和JS识别)

    前面的话 本文中所有IEx+代表包含x及x以上:IEx-代表包含x及x以下,仅个人习惯.例:IE7+代表IE7.IE8…… 本文中所有例子全部经过测试,欢迎交流. HTML识别 条件注释法(IE10+ ...

  8. UvaOJ10369 - Arctic Network

    /* The first line of each test case contains 1 <= S <= 100, the number of satellite channels! ...

  9. vs xamarin android 监听返回键退出程序

    public override bool OnKeyDown([GeneratedEnum]Keycode keyCode, KeyEvent e) { if (keyCode == Keycode. ...

  10. 机器学习&数据挖掘笔记_21(PGM练习五:图模型的近似推理)

    前言: 这次练习完成的是图模型的近似推理,参考的内容是coursera课程:Probabilistic Graphical Models . 上次实验PGM练习四:图模型的精确推理 中介绍的是图模型的 ...