ネットコア3.1 autofacを使用し、城は、AOPのセクションプログラミングを実現

プロジェクトの基本的な構成とパッケージファイルを導入する必要

ネットコア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();

  嗯,就这样。

おすすめ

転載: www.cnblogs.com/xianz/p/12315347.html