利用T4模板產生ASP.NET Core控制器的建構函式和參數

來源:互聯網
上載者:User

標籤:spec   模板   注意   library   tar   ons   system   產生   通過   

前言

在ASP.NET Core中引入了DI,並且通過建構函式注入參數,控制器中會大量使用DI注入各種的配置參數,如果配置注入的參數比較多,而且各個控制器需要的配置參數都基本一樣的話,那麼不斷重複的複製黏貼代碼提供相應的建構函式,效率低效也,因此使用T4模板組建控制器的建構函式 ,這也得益於C#對部分類別(partial)的支援。

 

T4模板組建控制器建構函式

圖中CtrlTemplate.tt為模板檔案,CtrlNames.txt為需要使用T4產生代碼的控制器名稱檔案,CtrlTemplate.cs為T4模板產生的檔案。

CtrlNames.txt檔案內容:

ValuesAccount

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.Controllers14 {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 : Controller23     {   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 : Controller10     {   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 : Controller22     {   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控制器的建構函式和參數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.