ASP.NET CoreはAutofacとCastleを統合して自動AOPブロックを実現

3808 ワード

前言:


ASPを除く.NETCoreが持参したIOCコンテナのほか、Autofac、StructureMapなど、他の成熟したDIフレームワークを使用することもできます(筆者はUnity、Ninject、Castleしか使ったことがありません).

1.ASP.NET CoreのAutofac


まずProject.jsonのDependencyノードには、次の参照が追加されます.
 "Microsoft.Extensions.DependencyInjection": "1.0.0",
 "Autofac": "4.1.1",
 "Autofac.Extensions.DependencyInjection": "4.0.0",

次に、StartupファイルのConfigureServicesメソッドも変更します.デフォルトのDIを引き継ぐために、関数に戻り値AutofacServiceProviderを追加します.

1.1 ConfigureServices関数

public IServiceProvider ConfigureServices(IServiceCollection services)
{
     services.AddApplicationInsightsTelemetry(Configuration);
     services.AddMvc();
     return RegisterAutofac(services);
}

1.2 RegisterAutofac関数

private IServiceProvider RegisterAutofac(IServiceCollection services)
{
     var builder = new ContainerBuilder();
     builder.Populate(services);
     var assembly = this.GetType().GetTypeInfo().Assembly;
     builder.RegisterType();
     builder.RegisterAssemblyTypes(assembly)
                  .Where(type =>
                   typeof(IDependency).IsAssignableFrom(type) && !type.GetTypeInfo().IsAbstract)
                  .AsImplementedInterfaces()
                  .InstancePerLifetimeScope().EnableInterfaceInterceptors().InterceptedBy(typeof(AopInterceptor));
      this.ApplicationContainer = builder.Build();
      return new AutofacServiceProvider(this.ApplicationContainer);
}

ここでIDependencyインタフェースは空のインタフェースであり,このインタフェースを実現するクラスをスキャンするために自動的に注入動作を完了する.

2.Castleを統合したDynamicProxy


統合を実現するには、上記の関数で、このコードを使用します.
.EnableInterfaceInterceptors().InterceptedBy(typeof(AopInterceptor));

2.2リファレンスセット


明らかにいくつかのプログラムセットはまだCoreの対応するバージョンのAutofacを持っていません.Extras.DynamicProxy、統合すると約束した以上、ソースコードを修正しましょう.
Autofac.Extras.DynamicProxyがCoreをサポートできないのは、主にソースコードに新しい反射APIが使用されていないため、GetTypeInfoまたはいくつかのRemotingのAPIが使用されているためです.
Core対応Autofac.Extras.DynamicProxyソースの内容とDemoのGithubアドレスは以下の通りです.
https://github.com/maxzhang1985/AutofacCastle.AspNetCore.Demo

3.注意事項


(1).Autofacコンテナを作成するときは、ConfigureServicesの戻り値をIServiceProviderに変更することを忘れないでください.(2).対応ASP.NET Coreが言及した異なるライフサイクルについては、Autofacも対応する拡張方法を定義しており、InstancePerLifetimeScopeなど、デフォルトではTransientモードであり、EntityFrameworkなどのContextもこのモードである.(3).Autofac CoreはViewからの注入をサポートしていませんが、ASP.NET CoreはIOC容器を持参して併用しています.
 
 
GitHub:https://github.com/maxzhang1985/YOYOFxもし覚えていたら、スターの下で、一緒に交流することを歓迎します.
 
.NET CoreとYOYOFxの交流群:214741894
 
本文が役に立つと思うなら、「推薦」をクリックしてください.ありがとうございます.