今日はjsonファイルで依存関係注入を設定する方法を紹介します。
以前の ASP.NET 4+ (MVC、Web Api、Owin、SingalR など) では、サードパーティの依存関係挿入コンポーネントを使用するために独自のインターフェイスが提供されていました。たとえば、Autofac、Untiy、String.Net が一般的に使用されていました。これらのサードパーティの依存関係注入コンポーネントは、基本的に、クラスに直接構成することに加えて、一連の構成注入または構成ライフサイクル メソッドを提供し、xml ファイルまたは json などの使用も提供します。新しい ASP.NET Core では、Microsoft がデフォルトで依存関係注入機能を提供しています。依存関係注入を実装するためにサードパーティのコンポーネントに依存する必要はなくなりましたが、依存関係注入を構成ファイルで構成したい場合があります。 , Microsoft 独自の DI コンポーネントでは構成ファイルが提供されないため、この構成項目の機能を自分で実装する必要があります。個人的には、主な使用シナリオは、コンパイル時に実装を決定できず、実装を動的に変更する必要がある場所だと感じています。
これを行う方法を見てみましょう。
はじめに
まず、アプリケーションで 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 インターフェイス パラメーターを通じてサービスが挿入されます。
public void ConfigureServices(IServiceCollection services) { services.Add(new ServiceDescriptor(serviceType: typeof(IFoo), implementationType: typeof(Foo), lifetime: ServiceLifetime.Transient)); }
ここでは、IServiceCollection の Add メソッドを使用して、一時的なライフサイクルを持つ IFoo 実装を追加します。一時的とは、Foo のインスタンスが要求されるたびに作成されることを意味します。
上記は、依存関係注入を追加するために Microsoft が提供するデフォルトの方法です。json ファイルを使用する必要がある方法に変換する方法を見てみましょう。
DI を構成するために json ファイルを使用する
json ファイルを使用して依存関係注入を構成する場合、新しい json ファイルを作成するか、appsettings.json ファイルを直接使用するかを選択できます。次に、DI 構成を appsettings.json ファイルに直接追加します。
appsettings.json
"Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } }, "DIServices": [ { "serviceType": "[namesapce].IFoo", "implementationType": "[namesapce].Foo", "lifetime": "Transient" } ] }
まず、「DIServices」という名前の配列ノードを追加します。この配列には、サービス インターフェイスの種類、implementationType インターフェイスの実装、および有効期間初期化インスタンスを表す 1 つ以上のオブジェクトが含まれています。ライフサイクル。
注: 構成ファイル内のタイプは完全な名前である必要があります。つまり、名前空間が含まれている必要があります。
次に、Json ファイル構成項目に対応するサービス クラスを追加します。ここでは、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 のアクションで使用します。
プログラムを実行し、ページを開き、[バージョン情報] タブをクリックします
概要
上記は、ASP.NET Core で json ファイルへの依存関係注入を構成する方法です。これは単なる例です。本番環境で使用してください。実際のプロジェクトでは、設定読み込み時の例外やサービスの有無、ライフサイクルなどの問題にも対処する必要があります。
JSON ファイルでの依存関係挿入を構成する ASP.NET Core の詳細な説明については、PHP 中国語 Web サイトの関連記事に注目してください。