ASP.NETコアのActionFilterとDI

I.はじめに

  以前の記事は、多分、我々はすべてのコンポーネントを拡張するために、依存性注入を通じてあるASP.NET COREで見つかったが、グループのためにしている、拡張ポイントに依存性注入(DI)ASP.NET MVCコアについて話していますそことして、機能を拡張するインターフェイスまたは抽象工場の組の関数となるIControllerActivatorのこの記事に機能ポイント(コントローラプロパティに注入Autofacによって.NETコア依存のソースコードを参照)にも記載されている、今日は紹介同様の大規模な拡張ポイントは、ASP.NET MVCのコアは、アクションフィルタ(すなわちフィルタ)に対する当社の依存性注入の拡大のための新たなメカニズムを提供します。

第二に、フィルタの依存性注入

  ASP.NET MVCのコアでは、フレームワークは種類を提供してくれます  IFilterの  属性は、以前のバージョンで持っていたリクエストを、傍受のためのアクション、アクションを飾るために、私たちは組み合わせたい場合は、依存性注入を使用します使用IFilterFactoryのアクションフィルタを作成するプロセスを拡張するためのインタフェースを。

  2.1  IFilterFactoryのインタフェース定義

パブリックインターフェースIFilterFactory:IFilterは
{ 
    のIFilterのCreateInstance([NOTNULL] IServiceProviderサービス・プロバイダ)。
}

 

  私たちが望む、その後、一般的に、あなたがしたい、フィルタの属性依存性の注入を作成する必要がありますコード:

コードをコピー
パブリッククラスFilterClass:ActionFilterAttribute   
{ 
  公共FilterClass(IDependency1 dependency1、IDependency2 dependency2)
  { 
    // ...使用依存性
  } 
}
コードをコピー

 

  ASP.NET MVCのコアは、私たちのために単純な二提供IFilterFactory :  ServiceFilterAttribute と  TypeFilterAttributeを 使用方法を参照するには例が必要です。

コードをコピー
パブリッククラスにHomeController:コントローラ   
{ 
    [のtypeFilter(typeof演算(FilterClass))] 
    [ServiceFilter(typeof演算(FilterClass))] 
    パブリックIActionResultインデックス()
    { 
        ビュー()を返します。
    } 
}
コードをコピー

  2.2 ServiceFilterAttribute 

   実際に何人かの友人は考えることができるようになり、名前を見て、それはの依存性注入に基づいてIFilterFactory、サービスはこの言葉を補強し、サービスを取得することにより、達成するために、依存性注入され、私たちは何を考えますか?()のgetServiceないですか?はい、実際には、それはこのメカニズムです。

     ServiceFilterするために、次の例のように、我々は最初のIOC FilterClass型コンテナに登録する必要があり、依存する対応注入される容器の種類に登録。

公共のボイドConfigureServices(IServiceCollectionサービス)
{ 
      services.AddSingleton <FilterClass>(); 
 
      services.AddMvc()
}

  工事の種類がFilterClass注入型を必要とする場合はもちろん、だけでなく、使用することができIOCコンテナを登録する必要があります。

  私たちは、ソースコードを見ServiceFilterAttribute:

コードをコピー
パブリッククラスServiceFilterAttribute:属性、IFilterFactory、IOrderedFilter 
{ 
    公共ServiceFilterAttribute([NOTNULL]タイプtype)
    { 
        たServiceType =タイプ; 
    } 

    パブリックタイプのServiceType {得ます。プライベートセット; } 

    公共のint型の注文{取得します。セットする; } 

    公共のIFilterのCreateInstance([NOTNULL] IServiceProviderサービス・プロバイダ)
    { 
        VARサービス= serviceProvider.GetRequiredService(サービス種別)。

        VARフィルタ=のIFilterなどのサービス。
        もし(フィルタ== NULL)
        { 
            ((Resources.FormatFilterFactoryAttribute_TypeMustImplementIFilterを新しいInvalidOperationExceptionがスローを 
                typeof演算(ServiceFilterAttribute).NAME、
                typeof演算(のIFilter).NAME))。
        } 

        のフィルタを返します。
    } 
}
コードをコピー

  2.3  型フィルタリングゲストトリビュート

   もちろん、あなたもこのフィルター同様のServiceFilterののtypeFilterフィルタを使用するように選択することができ、それはまた、実装IFilterFactoryのインタフェースを、そしてそれをフィルタリングするために、依存性注入を作成するために使用することができます。それは、コンテナのタイプを登録する必要がないためのtypeFilterは、依存性の注入でフィルタを作成することができ、我々はそのコードを見てと呼ばれていました:

コードをコピー
パブリッククラスTypeFilterAttribute:属性、IFilterFactory、IOrderedFilter 
{ 
    プライベートのObjectFactory工場。

    公共TypeFilterAttribute([NOTNULL]タイプtype)
    { 
        ImplementationType =タイプ; 
    } 

    パブリックオブジェクト[]引数{得ます。セットする; } 

    パブリックタイプImplementationType {得ます。プライベートセット; } 

    公共のint型の注文{取得します。セットする; } 

    公共のIFilterのCreateInstance([NOTNULL] IServiceProviderサービス・プロバイダ)
    { 
        IF(this.factory ==ヌル)
        { 
            VARのargumentTypes =引数.Select(A => a.GetType())+。てToArray();?

            this.factory = ActivatorUtilities.CreateFactory(ImplementationType、argumentTypes ?? Type.EmptyTypes)。
        } 

        リターン(のIFilter)this.factory(サービス・プロバイダ、引数)。
    } 
}
コードをコピー

第三に、結論

  誰が私が気づいた友人についての記事を見たのServiceProviderActivatorUtilities  この記事ServiceFilterAttributeとTypeFilterAttribute原理に異なることはそれらによってフィルターを作成することですので、シナリオの使用は、誰もが使用する方法を参照してください。実際に、私は最近、.NETのコアのソースコードは、あなたは、Microsoftのコードの多くでも、以前の拡張ポイントではなく、そう、オープンAPI、ASP.NETどこでも実際にはインタフェース、拡張ポイントを形成する工場での使用依存性注入の例を、見ることができますコアは、私たちは「オープン」なフレームワークを参照してください。

 

  GitHubの:https://github.com/maxzhang1985/YOYOFx   睡眠も尋ねることができるかどうスター、歓迎の交換を。

 

  .NETのコアオープンソースの学習グループ:  214 741 894  

 

 
カテゴリー:  .NETのコア 、  ASP.NET MVCのコア
 
6
0
 
 
 
<<  前:  ビュー.NETのコアソース依存性の注入は、コントローラプロパティAutofacによって達成するために
>>  次の記事:  ASP.NET MVCのコアファイルのアップロード制限の問題を解決

I.はじめに

  以前の記事は、多分、我々はすべてのコンポーネントを拡張するために、依存性注入を通じてあるASP.NET COREで見つかったが、グループのためにしている、拡張ポイントに依存性注入(DI)ASP.NET MVCコアについて話していますそことして、機能を拡張するインターフェイスまたは抽象工場の組の関数となるIControllerActivatorのこの記事に機能ポイント(コントローラプロパティに注入Autofacによって.NETコア依存のソースコードを参照)にも記載されている、今日は紹介同様の大規模な拡張ポイントは、ASP.NET MVCのコアは、アクションフィルタ(すなわちフィルタ)に対する当社の依存性注入の拡大のための新たなメカニズムを提供します。

第二に、フィルタの依存性注入

  ASP.NET MVCのコアでは、フレームワークは種類を提供してくれます  IFilterの  属性は、以前のバージョンで持っていたリクエストを、傍受のためのアクション、アクションを飾るために、私たちは組み合わせたい場合は、依存性注入を使用します使用IFilterFactoryのアクションフィルタを作成するプロセスを拡張するためのインタフェースを。

  2.1  IFilterFactoryのインタフェース定義

パブリックインターフェースIFilterFactory:IFilterは
{ 
    のIFilterのCreateInstance([NOTNULL] IServiceProviderサービス・プロバイダ)。
}

 

  私たちが望む、その後、一般的に、あなたがしたい、フィルタの属性依存性の注入を作成する必要がありますコード:

コードをコピー
パブリッククラスFilterClass:ActionFilterAttribute   
{ 
  公共FilterClass(IDependency1 dependency1、IDependency2 dependency2)
  { 
    // ...使用依存性
  } 
}
コードをコピー

 

  ASP.NET MVCのコアは、私たちのために単純な二提供IFilterFactory :  ServiceFilterAttribute と  TypeFilterAttributeを 使用方法を参照するには例が必要です。

コードをコピー
パブリッククラスにHomeController:コントローラ   
{ 
    [のtypeFilter(typeof演算(FilterClass))] 
    [ServiceFilter(typeof演算(FilterClass))] 
    パブリックIActionResultインデックス()
    { 
        ビュー()を返します。
    } 
}
コードをコピー

  2.2 ServiceFilterAttribute 

   実際に何人かの友人は考えることができるようになり、名前を見て、それはの依存性注入に基づいてIFilterFactory、サービスはこの言葉を補強し、サービスを取得することにより、達成するために、依存性注入され、私たちは何を考えますか?()のgetServiceないですか?はい、実際には、それはこのメカニズムです。

     ServiceFilterするために、次の例のように、我々は最初のIOC FilterClass型コンテナに登録する必要があり、依存する対応注入される容器の種類に登録。

公共のボイドConfigureServices(IServiceCollectionサービス)
{ 
      services.AddSingleton <FilterClass>(); 
 
      services.AddMvc()
}

  工事の種類がFilterClass注入型を必要とする場合はもちろん、だけでなく、使用することができIOCコンテナを登録する必要があります。

  私たちは、ソースコードを見ServiceFilterAttribute:

コードをコピー
パブリッククラスServiceFilterAttribute:属性、IFilterFactory、IOrderedFilter 
{ 
    公共ServiceFilterAttribute([NOTNULL]タイプtype)
    { 
        たServiceType =タイプ; 
    } 

    パブリックタイプのServiceType {得ます。プライベートセット; } 

    公共のint型の注文{取得します。セットする; } 

    公共のIFilterのCreateInstance([NOTNULL] IServiceProviderサービス・プロバイダ)
    { 
        VARサービス= serviceProvider.GetRequiredService(サービス種別)。

        VARフィルタ=のIFilterなどのサービス。
        もし(フィルタ== NULL)
        { 
            ((Resources.FormatFilterFactoryAttribute_TypeMustImplementIFilterを新しいInvalidOperationExceptionがスローを 
                typeof演算(ServiceFilterAttribute).NAME、
                typeof演算(のIFilter).NAME))。
        } 

        のフィルタを返します。
    } 
}
コードをコピー

  2.3  型フィルタリングゲストトリビュート

   もちろん、あなたもこのフィルター同様のServiceFilterののtypeFilterフィルタを使用するように選択することができ、それはまた、実装IFilterFactoryのインタフェースを、そしてそれをフィルタリングするために、依存性注入を作成するために使用することができます。それは、コンテナのタイプを登録する必要がないためのtypeFilterは、依存性の注入でフィルタを作成することができ、我々はそのコードを見てと呼ばれていました:

コードをコピー
パブリッククラスTypeFilterAttribute:属性、IFilterFactory、IOrderedFilter 
{ 
    プライベートのObjectFactory工場。

    公共TypeFilterAttribute([NOTNULL]タイプtype)
    { 
        ImplementationType =タイプ; 
    } 

    パブリックオブジェクト[]引数{得ます。セットする; } 

    パブリックタイプImplementationType {得ます。プライベートセット; } 

    公共のint型の注文{取得します。セットする; } 

    公共のIFilterのCreateInstance([NOTNULL] IServiceProviderサービス・プロバイダ)
    { 
        IF(this.factory ==ヌル)
        { 
            VARのargumentTypes =引数.Select(A => a.GetType())+。てToArray();?

            this.factory = ActivatorUtilities.CreateFactory(ImplementationType、argumentTypes ?? Type.EmptyTypes)。
        } 

        リターン(のIFilter)this.factory(サービス・プロバイダ、引数)。
    } 
}
コードをコピー

第三に、結論

  誰が私が気づいた友人についての記事を見たのServiceProviderActivatorUtilities  この記事ServiceFilterAttributeとTypeFilterAttribute原理に異なることはそれらによってフィルターを作成することですので、シナリオの使用は、誰もが使用する方法を参照してください。実際に、私は最近、.NETのコアのソースコードは、あなたは、Microsoftのコードの多くでも、以前の拡張ポイントではなく、そう、オープンAPI、ASP.NETどこでも実際にはインタフェース、拡張ポイントを形成する工場での使用依存性注入の例を、見ることができますコアは、私たちは「オープン」なフレームワークを参照してください。

 

  GitHubの:https://github.com/maxzhang1985/YOYOFx   睡眠も尋ねることができるかどうスター、歓迎の交換を。

 

  .NETのコアオープンソースの学習グループ:  214 741 894  

 

おすすめ

転載: www.cnblogs.com/webenh/p/11605632.html