今天給大家介紹一下如何在在 json 檔案中配置依賴注入。
在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等)時候,都是提供了專有的介面以供使用第三方的依賴注入組件,比如我們常用的會使用 Autofac、Untiy、String.Net 等,這些第三放依賴注入組件基本上都提供了一套配置注入或者配置生命週期的方式,除了直接配置到類裡面之外,還提供了要麼使用 xml 檔案,要麼使用 json 等,那麼在新的 ASP.NET Core 中微軟已經預設的給我們提供了一個依賴注入的功能,我們就不再需要藉助於第三方組件來實現依賴注入了,但是有時候我們想在設定檔中來配置依賴注入,微軟本身的 DI 組件並沒有給我們提供一個可供配置的檔案,那麼我們就需要自己來實現這個配置項的功能。個人覺得其主要使用情境是一些在編譯時間不能確定實現的,需要動態修改實現的地方。
下面就來看看應該如何來做這件事情吧。
Getting Started
首先,在應用程式中我們建立一個介面,以供 DI使用:
public interface IFoo{ string GetInputString(string input);}
然後,添加一個 IFoo 介面的實現 Foo
public class Foo : IFoo{ public string GetInputString(string input) { return $"輸入的字串為:{ input }"; }}
接下來,我們需要把以上的 IFoo 介面和它的實現添加到 Startup.cs 檔案中的ConfigureServices方法中,ConfigureServices 主要是用來配置依賴注入服務的。然後通過該方法提供的ISerciceCollection介面參數注入 Services。
public void ConfigureServices(IServiceCollection services){ services.Add(new ServiceDescriptor(serviceType: typeof(IFoo), implementationType: typeof(Foo), lifetime: ServiceLifetime.Transient));}
這裡,我們使用到了 IServiceCollection 裡面的 Add 方法,添加一個生命週期為瞬態的 IFoo 的實現。瞬態就是說在每次請求的時候都將建立一個Foo的執行個體。
以上是預設微軟為我們提供的添加依賴注入的方法,下面我們來看一下怎麼來改造成我們需要的使用 json 檔案的方式。
使用 json 檔案配置 DI
當我們使用json檔案配置依賴注入的時候,可以選擇建立一個json檔案,也可以直接使用 appsettings.json 檔案。現在我們就直接在 appsettings.json 檔案中添加關於DI的配置了。
appsettings.json
"Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } }, "DIServices": [ { "serviceType": "[namesapce].IFoo", "implementationType": "[namesapce].Foo", "lifetime": "Transient" } ]}
首先,添加一個名為 “DIServices” 的數組節點,數組中包含一個或多個配置service的對象,serviceType代表格服務介面的類型,implementationType介面的實現,lifetime 初始化執行個體的生命週期。
注意:設定檔中的類型必須為全名稱,即包含命名空間。
接下來,添加一個和Json檔案配置項相對應的一個service類,這裡我們需要使用 Newtonsoft 這個json庫。
using Microsoft.Extensions.DependencyInjection;using Newtonsoft.Json;using Newtonsoft.Json.Converters; public class Service{ public string ServiceType { get; set; } public string ImplementationType { get;set; } [JsonConverter(typeof(StringEnumConverter))] public ServiceLifetime Lifetime { get; set; }}
然後需要改造一下ConfigureServices,在 ConfigureServices 中讀取配置的 json檔案即可。
public void ConfigureServices(IServiceCollection services){ //services.Add(new ServiceDescriptor(serviceType: typeof(IFoo), // implementationType: typeof(Foo), // lifetime: ServiceLifetime.Transient)); var jsonServices = JObject.Parse(File.ReadAllText("appSettings.json"))["DIServices"]; var requiredServices = JsonConvert.DeserializeObject<List<Service>>(jsonServices.ToString()); foreach (var service in requiredServices) { services.Add(new ServiceDescriptor(serviceType: Type.GetType(service.ServiceType), implementationType: Type.GetType(service.ImplementationType), lifetime: service.Lifetime)); }}
然後我們測試一下是否是可用的。
測試
開啟 HomeController.cs ,添加註入項:
public class HomeController : Controller{ private readonly IFoo _foo; public HomeController(IFoo foo) { _foo = foo; } public IActionResult About() { ViewData["Message"] = _foo.GetInputString("Your application description page."); return View(); }}
在 HomeController的建構函式添加IFoo介面,然後在 About 的Action中使用。
運行程式,開啟頁面,點擊 About標籤
總結
以上即為在 ASP.NET Core 中配置依賴注入到json檔案中,這隻是一個簡單的執行個體,不要用在生產環境中。在實際的項目中你還需要處理關於讀取配置異常情況,服務是否存在的異常情況,生命週期等等這些問題。