プロジェクトの基本的な構成とパッケージファイルを導入する必要
ネットコア3.1および2.2の使用中autofacはので、ここでは約レコードを異なる持っています。
簡単なデモプロジェクトを作成、またはAPIコンソールプログラムとMVCモードが可能。
連続的に導入さ依存性:
Autofac:コンテナコントロールを提供 拡張のautofac依存性注入:Autofac.Extensions.DependencyInjection Autofac.Extras.DynamicProxy:動的プロキシautofac拡張する Castle.Coreを動的プロキシを使用します
バージョンの矛盾は、ここでは、問題ではありません。私は、対応する最新のパッケージをロードしました。
プロジェクトで使用
使用したプロジェクトで注意すべき2つの場所があります。
1. autofacコンテナのProgram.csプログラムのエントリを指定するには
パブリック 静的 IHostBuilder CreateHostBuilder(文字列 []引数)=> Host.CreateDefaultBuilder(引数) .UseServiceProviderFactory(新しいAutofacServiceProviderFactory())//指定使用autofac .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup <起動時> (); });
2.スタートアップ入学ConfigureContainerをファイルの起動中にコンテナを追加し、デフォルトの方法とパラメータが変更されないかもしれません
ここで私はインターフェイスISayと実装セイを作成し、コンテナ内に注入されます。
対応するコード
パブリック インターフェースISay { PeopleEntityのsayHello(PeopleEntity peopleEntity)。 } [インターセプト(typeof演算(InjectInterceptor))] パブリック クラスセイ:ISay { 公共PeopleEntityのsayHello(PeopleEntity peopleEntity) { peopleEntity.Name = $ " こんにちは{peopleEntity.Name} " 。 返すpeopleEntityを。 } }
ここでは、ライン上のコントローラに直接注入を使用します
ここでは簡単な使用のautofacコンテナが完了しているのです。
レッツ・利用城は、AOPを使用して実装すること
インターセプターはInjectInterceptorと呼ばれる新しいクラスを作成し、IInterceptor(インタフェースでCastle.DynamicProxy)を達成しなければならない、すなわち仮想インターセプト法はIInvocationインターフェイスパラメータを渡します。
public class InjectInterceptor : IInterceptor { public virtual void Intercept(IInvocation invocation) { PreProceed(invocation); invocation.Proceed(); Console.WriteLine(invocation.ReturnValue); PostProceed(invocation); } private void PreProceed(IInvocation invocation) { Console.WriteLine($"{DateTime.Now} interceptor invoke start"); } private void PostProceed(IInvocation invocation) { Console.WriteLine($"{DateTime.Now} interceptor invoke end"); } }
在这里,我标记Say的方法,这里指明Intercept只能标记类或接口,不能标记特定的方法,所以你标记对应的类或接口时,内部的方法都会被拦截。
[Intercept(typeof(InjectInterceptor))] public class Say : ISay
在这里说明,这里是配合autofac使用的所以需要在Startup中的ConfigureContainer方法中注册拦截方法及注册这个Say方法时要开启允许方法拦截。
builder.RegisterType<InjectInterceptor>(); builder.RegisterType<Say>().As<ISay>().EnableInterfaceInterceptors();
嗯,就这样。