07 |拡張機能を持つAutofacコンテナ:アスペクト指向プログラミング(AOP)のを導入する能力
このセクションでは、依存性注入コンテナを拡張するため、サードパーティ製のフレームワークの使用方法について説明します
私たちは、どのような状況下でサードパーティ製の容器のコンポーネントを導入する必要がありますか?
組立デフォルトのコンテナを使用するほとんどの場合には、十分な
あなたはいくつかの非常に特別なシナリオが必要な場合は、次のとおりです。
1、注入名に基づい:時間に応じてサービスを区別するために名前を配置する必要があり、それは、異なる実装です
2、注入特性:そのような基準およびコンストラクタ前とコンストラクタを定義する必要なく、内部に特定のクラス、にサービス登録に直接プロパティFromService
3、サブコンテナ:それは以前に対象範囲の話として理解することができますが、実際には第三者とのいくつかの特別なサブフレームのコンテナを達成することができます
動的プロキシAOPに基づいて4:サービスに追加アクションを注入する必要性は、動的プロキシの能力を使用することができます
.NETコア依存性注入フレームワーク、そのコアの拡張ポイントIserviceProviderFactory
第三のクラスに依存注入容器は、全体フレームワークに自分自身を注入するために、拡張ポイントとして使用されています
それはそれは、直接せずに、それだけの正式な定義のコアに焦点を当てる必要があります誰かインターフェース、どのようなものであったか誰かの特性は、これらのフレームワークに依存していることを心配せずに、これらの依存性注入フレームワークを使用して言うことです
ソースリンク:
https://github.com/witskeeper/geektime/tree/master/samples/DependencyInjectionAutofacDemo
サービス
namespace DependencyInjectionAutofacDemo.Services
{
public interface IMyService
{
void ShowCode();
}
public class MyService : IMyService
{
public void ShowCode()
{
Console.WriteLine($"MyService.ShowCode:{GetHashCode()}");
}
}
public class MyServiceV2 : IMyService
{
/// <summary>
/// 用于演示属性注入的方式
/// </summary>
public MyNameService NameService { get; set; }
public void ShowCode()
{
// 默认情况下,NameService 为空,如果注入成功,则不为空
Console.WriteLine($"MyServiceV2.ShowCode:{GetHashCode()},NameService是否为空:{NameService == null}");
}
}
public class MyNameService
{
}
}
Autofacを統合する方法で見てみましょう
Autofacそれは、コンテナフレームの内側最古のコミュニティの一つであるため、.NETを使用して
これは、2つのパッケージがあります。
Autofac.Extensions.DependencyInjection
Autofac.Extras.DynamicProxy
この2つのパッケージの導入は、次の4つの能力の前に言っ達成するためにそれを使用することができます
この2つのパッケージを導入した後、必要性は、プログラム内のコードの行を追加します
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
UseServiceProviderFactoryは、サードパーティ製のコンテナを登録するためのエントリであります
スタートアップの変化もあり、我々はConfigureContainerメソッドを追加する必要があり、それはContainerBuilder Autofacの参加です
public void ConfigureContainer(ContainerBuilder builder)
2 ConfigureServices、デフォルト、1 ConfigureContainerがあります。
デフォルトのコンテナサービスに登録した後、実際には、Autofacを成功し、その後ConfigureContainerを実行することです
その後、Autofacの特定の実装を登録するには、前にさまざまな方法の登録と登録の仕方、そしてそれは、前の文言に、反対のサービスの種類としてそれをマークしたかっ伝えます
builder.RegisterType<MyService>().As<IMyService>();
次はあなたがサービスを複数回登録する必要がある場合、登録され、このように彼らができるように区別するために別の名前で、引数はサービス名である名前です
builder.RegisterType<MyServiceV2>().Named<IMyService>("service2");
どのようにそれを使用するには?
public ILifetimeScope AutofacContainer { get; private set; }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 注册根容器
this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();
// Autofac 容器获取实例的方式是一组 Resolve 方法
var service = this.AutofacContainer.ResolveNamed<IMyService>("service2");
service.ShowCode();
...
次のようにプログラムを起動し、出力は次のようになります。
MyServiceV2.ShowCode:61566768,NameService是否为空:True
この作品は、ある非営利- -同一条件許諾4.0の国際ライセンス契約クリエイティブ・コモンズのライセンスのために。
転載、使用、再投稿へようこそ、しかし鄭Ziming(リンクを含む:http://www.cnblogs.com/MingsonZheng/)によって署名された記事を保つようにしてください、商業目的のために使用してはならない、紙のライセンス変更に基づいて、同じ作業を公開するようにしてください。
ご質問があれば、私に連絡してください([email protected])。