ASP.NET 코어 - 의존성 주입에 ActionFilter를 사용

마지막 ActionFilter가 이상 EF에 의한 본질적으로하는 핵심 기술 ActionFilter의 버전이 아닌 원인에 충분히 강한 이해하다, 마이크로 소프트의 공식 문서를 읽을 시간이 걸렸습니다. 문제 외에도 유료 관심을 필요로하는 의존성 삽입 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 코어에 의존성 주입을 사용하는 방법은 두 가지가 있습니다 :

  1. ServiceFilterAttribute
  2. TypeFilterAttribute

ServiceFilterAttribute

사용 ServiceFilterAttribute은 ActionFilter 완전한 의존성 주입을 할 수 있습니다. 사실, 당신은 서비스가 DI 컨테이너를 등록 된 ActionFilter 자체 등록 사용하고 싶습니다. 인 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 완전한 의존성 주입을 할 수 있습니다. 그것은 유사과 ServiceFilterAttribute하지만 TypeFilterAttribute 아닌 사용 ActionFilter는 DI 컨테이너를 찾기하지만, 직접 Microsoft.Extensions.DependencyInjection.ObjectFactory하여 개체의 인스턴스를 주입. 그래서 우리는 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 중요한 차이점, ServiceFilterAttribute하지이 속성을 가진 TypeFilterAttribute입니다. 타입의 객체 어레이의 인수. 생성자의 매개 변수 유형은 선박 DI에있는 경우에, 우리는 인스턴스화 TypeFilterAttribute ActionFilter의 목록을 순차적으로 인수를받는 것입니다.
변화 FilterInjectAttribute의 복수 빌더는 두 개의 매개 변수를 추가하고, 두 개의 매개 변수는 페치 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 .");
        }
    }

두 개의 매개 변수를 사용할 때 수신 :

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

            return "DI";
        }

FilterInjectAttribute 생성자에 소개되는 두 개의 매개 변수를보고에 대해 실행 :

개요

  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