ASP.NETコア - のActionFilterを使用して依存性注入で

最後のActionFilterが異常EFによって引き起こされる、本質的には、コア知識のActionFilterのバージョンではない原因の強い十分に把握され、それはMicrosoftの公式ドキュメントを読むために時間がかかりました。問題に加えても注意を払うに必要な依存性注入のActionFilterの使用上の場所があり、IActionFilter、IAsyncActionFilterを発見しました。
私たちのActionFilterの必要性は、サービスを利用するとき、私たちは通常、コンストラクタを介して注入します。
あなたが最初のActionFilterをカスタマイズし、表示、IMyServiceは、コンストラクタを介して注入しました:

    public interface IMyService
    {
        string GetServiceName(); 
    }

    public class MyService : IMyService
    {
        public MyService ()
        {
            Console.WriteLine("Service {0} created .", GetServiceName());
        }

        public string GetServiceName()
        {
            return "MyService";
        }
    }

    public class FilterInjectAttribute: ActionFilterAttribute
    {
        public FilterInjectAttribute(IMyService myService)
        {
            if (myService == null)
            {
                throw new ArgumentNullException("myService");
            }

            Console.WriteLine("Service {0} was injected .", myService.GetServiceName());
        }
    }

しかし、我々 VS属性赤のヒントを使用した場合、直接与えられたが、必要性は、コンストラクタに引数を渡すために、あるいは過去にコンパイルすることはできません。

もちろん、我々は直接MyServiceでの新しいパラメータとしてすることができますが、これらの人は、注射の利益を失ったことは明らかです。

使用依存性注入でのActionFilter

中のActionFilterのASP.NETコアに依存性注入を使用する方法は2つあります。

  1. ServiceFilterAttribute
  2. TypeFilterAttribute

ServiceFilterAttribute

使用ServiceFilterAttributeはあなたのActionFilter完全な依存性の注入を行うことができます。実際には、のActionFilterを利用したいサービスはDIコンテナを登録して自分自身を登録。ServiceFilterを介して容器からあなたのActionFilterを取得し、必要な場所に注入しました。だから、最初のステップは、あなたのActionFilterを登録することです。

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<IMyService,MyService>();
            services.AddScoped(typeof(FilterInjectAttribute));

            services.AddControllers();
            services.AddRazorPages();
        }

そして、アクションの新しいコントローラー、使用ServiceFilterを作成します。

        [ServiceFilter(typeof(FilterInjectAttribute))]
        public string DI()
        {
            Console.WriteLine("HomeController method DI running .");

            return "DI";
        }

対応するアクセス下のブラウザでパス、について実行すると、あなたはMyServiceでは中FilterInjectAttributeに注入された見ることができます。

IsReusable属性のServiceFilterAttribute:

ServiceFilterはIsReusableというプロパティがあります。これはよく、再利用可能な意味かどうか、である文字通りの意味から理解されています。この明白なプロパティをTrueに設定されている場合は、複数の要求は、こののActionFilterを再利用しますが、それは少しシングルトン平均のようなものです。

        [ServiceFilter(typeof(FilterInjectAttribute), IsReusable = true)]
        public string DI()
        {
            Console.WriteLine("HomeController method DI running .");

            return "DI";
        }

ブラウザのパスに対応するアクションにアクセスするために何回かにそれを実行して、あなたは一度だけFilterInjectAttributeコンストラクタを見ることができます。

重要なヒントがあり、ASP.NETコアランタイムは、フィルタが真のシングルトンであることを保証するものではありませんだから、シングルトンを達成するために、このプロパティを使用しようとすると、ビジネスシステムは、この一つのケースに依存しないでください。

TypeFilterAttribute

使用TypeFilterAttributeはまたあなたのActionFilter完全な依存性の注入を行うことができます。TypeFilterAttributeの使用はのActionFilterがDIコンテナを検索しますが、直接Microsoft.Extensions.DependencyInjection.ObjectFactoryでオブジェクトをインスタンス化するために注入さ似ていますが、ないとそれServiceFilterAttribute。だから我々はFilterInjectAttribute DIコンテナに事前に登録する必要はありません。
FilterInjectAttribute登録コードうち最初のコメント:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<IMyService,MyService>();

            //services.AddScoped(typeof(FilterInjectAttribute));

            services.AddControllers();
            services.AddRazorPages();
        }

TypeFilterAttribute代わりに:

        [TypeFilter(typeof(FilterInjectAttribute))]
        public string DI()
        {
            Console.WriteLine("HomeController method DI running .");

            return "DI";
        }

対応するアクセス下のブラウザでパス、について実行すると、あなたはMyServiceでは中FilterInjectAttributeに注入された見ることができます。

IsReusable属性のTypeFilterAttribute:

ServiceFilter上記と同じように、ASP.NETコアランタイムは、このフィルタは本当に一つのケースであることを保証するものではないではない、より長いったらしいここで、。

TypeFilterAttributeの引数プロパティ:

引数パラメータはServiceFilterAttribute重要な違いがTypeFilterAttribute、ServiceFilterAttributeないこのプロパティです。型オブジェクト配列の引数。そのコンストラクタのパラメータの型が血管DIで見つかった場合、当社は、インスタンス化TypeFilterAttributeのActionFilterのリストを順次引数を受け続けます。
変更FilterInjectAttributeの複数ビルダーは、2つのパラメータを追加し、2つのパラメータがフェッチDIから保証できません。

    public class FilterInjectAttribute: ActionFilterAttribute
    {
        public FilterInjectAttribute(string arg1, IMyService myService, string arg2)
        {
            if (myService == null)
            {
                throw new ArgumentNullException("myService");
            }

            Console.WriteLine("Service {0} was injected .", myService.GetServiceName());
            Console.WriteLine("arg1 is {0} .", arg1);
            Console.WriteLine("arg2 is {0} .", arg2);

            Console.WriteLine("FilterInjectAttribute was created .");
        }
    }

2つのパラメータを使用した場合、着信:

        [TypeFilter(typeof(FilterInjectAttribute), Arguments  = new object[] { "HAHA", "HOHO" })]
        public string DI()
        {
            Console.WriteLine("HomeController method DI running .");

            return "DI";
        }

FilterInjectAttributeコンストラクタに導入されている2つのパラメータを見てについての実行:

概要

  1. ActionFilterAttribute依存性注入はServiceFilterAttribute、TypeFilterAttributeによって達成することができます
  2. ServiceFilterAttributeはDIコンテナActionFilterAttributeによって管理されている。TypeFilterAttributeが直接植物によってインスタンス化され、DIコンテナを使用する前に登録する必要はありません。
  3. IsReusableプロパティは、同様の機能は、単一の実施形態で達成することができるが、唯一つの実施形態ランタイムことを保証するものではありません。
  4. TypeFilterAttribute引数プロパティは、パラメータリストとして使用することができます。コンストラクタのパラメータ型がDIに登録されていない場合、それは引数がインスタンス化をActionFilterAttributeリストからコンテナを削除しようとします。

おすすめ

転載: www.cnblogs.com/kklldog/p/di-in-core-actionfilter.html