ASP.Net Core 自帶了一個極簡的 開箱即用
的依賴注入容器,實際上,你還可使用第三方的 依賴注入容器
來替代它,依賴注入是一種設計模式,它可以有效的實現對象之間的解耦並有利於提升單元測試和維護性,你可使用 依賴注入
來改進你的代碼設計,而不像原來那樣處處都是 new 對象。html
Lamar 是一個流行的,高效的,模塊化的 IOC 容器,這篇文章咱們將會討論如何在 ASP.Net Core 中使用 Lamar。web
要說 .NET 世界最先的依賴注入容器,當屬 StructureMap
,但 StructureMap
最大的缺點就是性能問題,而本篇的 Lamar 則很是輕量級,並提供了豐富的可供調用API,Lamar 和 StructureMap 很是相似,若是你之前 StructureMap 玩的溜的話,切到 Lamar 上是很是容易的。設計模式
要想在 ASP.Net Core 中使用 Lamar,須要經過 nuget 安裝以下兩個包。架構
Lamar模塊化
Lamar.Microsoft.DependencyInjection函數
你能夠經過可視化界面 Manage NuGet Packages
。性能
或者以下命令進行安裝。單元測試
Install-Package Lamar Install-Package Lamar.Microsoft.DependencyInjection
首先建立一個 IDBManager 接口類,用於後續作依賴注入用,代碼定義以下:測試
public interface IDBManager { void Initialize(); bool Save<T>(T obj); }
接下來定義 DBManager 類並實現接口 IDBManager ,代碼定義以下:ui
public class DBManager: IDBManager { public void Initialize() { //Write some initialization code here } public bool Save<T>(T obj) { //Write your code here return true; } }
Lamar.Microsoft.DependencyInjection
包提供了一個 UseLamar()
方法可以將 Lamar 引入到 ASP.Net Core 基礎架構中,下面的代碼展現瞭如何去實現。
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).UseLamar().Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
接下來能夠在 ConfigureServices()
方法中配置 Container 容器,代碼以下:
public void ConfigureServices(IServiceCollection services) { var container = new Container(x => { x.AddTransient<IDBManager, DBManager>(); }); services.AddControllersWithViews(); }
值得注意的是 Lamar 擁有強大的 自動裝配
能力,它能夠搜索請求類型和所需類型的構造函數,並構建其須要的實例,下面的代碼展現瞭如何經過 ConfigureContainer()
方法去實現,這裏我將該方法放在 Startup
類中,完整代碼以下:
public class Startup { // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var container = new Container(x => { x.AddTransient<IDBManager, DBManager>(); }); services.AddControllersWithViews(); } public void ConfigureContainer(ServiceRegistry services) { services.Scan(s => { s.TheCallingAssembly(); s.WithDefaultConventions(); }); } }
接下來就能夠在 Controller 中經過依賴注入的方式獲取 DBManager 實例啦,實現代碼以下:
public class HomeController : Controller { private readonly ILogger<HomeController> _logger; private IDBManager _dbManager; public HomeController(ILogger<HomeController> logger, IDBManager dbManager) { _logger = logger; _dbManager = dbManager; } public IActionResult Index() { return View(); } }
ASP.Net Core 自帶的依賴注入容器放在 IOC 圈子裏來講那真是太弱了,太須要第三方來擴充了, Lamar 就是這樣一款很是優秀的 IOC 容器,也是 StructureMap 很是好的替代品。
譯文連接:https://www.infoworld.com/article/3339698/how-to-use-lamar-in-aspnet-core.html