Ядро ActionFilter ASP.NET и DI

I. Введение

  В предыдущих статьях речь идет о инъекции зависимостей (DI) ASP.NET MVC ядра в точке расширения, может быть , мы нашли в ASP.NET CORE Все компоненты через инъекции зависимостей для расширения, но для группы будет функцией набора интерфейсов или абстрактной фабрики , чтобы расширить функциональные возможности , так как IControllerActivator точка функции по этой статье (см исходного кода для .NET ядра ПОЛАГАНИЯ Autofac впрыскивается в собственность Controller) также упоминается, сегодня мы вводим подобные крупные точки расширения, ASP.NET MVC ядра обеспечивает новый механизм для расширения нашей инъекции зависимостей к фильтрам действий (например , фильтры).

Во-вторых, инъекции фильтр зависимость

  В ASP.NET MVC ядра, структура дает нам тип  IFilter  Атрибуты для украшения Действие, действие для перехвата запроса, который имел в предыдущих версиях, но если мы хотим объединить, а затем использовать зависимость инъекций использовать IFilterFactory интерфейс для расширения процесса создания действия фильтра.

  2,1  IFilterFactory определение интерфейса

Интерфейс IFilterFactory общественности: IFilter 
{ 
    IFilter CreateInstance ([NotNull] IServiceProvider ServiceProvider); 
}

 

  Код, который мы хотим, и нужно создать фильтр Атрибут инъекции зависимостей, то как правило, вы хотите:

Скопировать код
общественный класс Фильтровальный: ActionFilterAttribute   
{ 
  общественный Фильтровальный (IDependency1 dependency1, IDependency2 dependency2) 
  { 
    // ... зависимости использование 
  } 
}
Скопировать код

 

  ASP.NET MVC Ядро обеспечивает два простых для нас IFilterFactory ServiceFilterAttribute  и  TypeFilterAttribute  . Будьте примером , чтобы увидеть , как использовать.

Скопировать код
класс HomeController общественности: Controller   
{ 
    [TypeFilter (TypeOf (Фильтровальный))] 
    [ServiceFilter (TypeOf (Фильтровальный))] 
    общественный индекс IActionResult () 
    { 
        вернуться View (); 
    } 
}
Скопировать код

  2,2 ServiceFilterAttribute 

   На самом деле увидеть имя, некоторые друзья будут в состоянии думать, и он основан на введении зависимости от более IFilterFactory , служба усиливает это слово это инъекция зависимости достичь пути получения услуг, мы считаем , что? Не GetService ()? Да, на самом деле, именно этот механизм.

     Для того, чтобы ServiceFilter зарегистрирован на тип контейнера, который будет введен, соответствующий полагаться, как показано в следующем примере, мы должны сначала зарегистрироваться в контейнер типа МОК Фильтровальный.

общественный недействительный ConfigureServices (услуги IServiceCollection) 
{ 
      services.AddSingleton <Фильтровальный> (); 
 
      services.AddMvc () 
}

  Конечно, если тип конструкции требует Фильтровального типа впрыска, но также необходимо зарегистрировать контейнер МОК может быть использовано.

  ServiceFilterAttribute мы посмотрим на исходный код:

Скопировать код
общественный класс ServiceFilterAttribute: Атрибут, IFilterFactory, IOrderedFilter 
{ 
    общественного ServiceFilterAttribute ([NotNull] Тип типа) 
    { 
        ServiceType = тип; 
    } 

    Общественного типа ServiceType {получить; частный набор; } 

    Общественного ИНТ заказа {получить; установлен; } 

    Общественного IFilter CreateInstance ([NotNull] IServiceProvider ServiceProvider) 
    { 
        вар обслуживание = serviceProvider.GetRequiredService (ServiceType); 

        вар фильтр = услуга , как IFilter; 
        если (фильтр == NULL) 
        { 
        Вернуть фильтр; 
            певд InvalidOperationException (Resources.FormatFilterFactoryAttribute_TypeMustImplementIFilter (
                TypeOf (ServiceFilterAttribute) .Name, 
                TypeOf (IFilter) .Name)); 
        } 

    } 
}
Скопировать код

  2,3  Тип фильтрации гостевой дани

   Конечно , вы можете также выбрать , чтобы использовать этот фильтр аналогично ServiceFilter TypeFilter фильтр, он также реализует IFilterFactory интерфейсы, и может быть использован для создания инъекции зависимостей для фильтрации через него. TypeFilter был назван потому , что ему не нужно , чтобы зарегистрировать тип контейнера может создать фильтр в зависимости инъекций, мы рассмотрим ее код:

Скопировать код
общественный класс TypeFilterAttribute: Атрибут, IFilterFactory, IOrderedFilter 
{ 
    частный ObjectFactory завод; 

    общественного TypeFilterAttribute ([NotNull] Тип) 
    { 
        ImplementationType = тип; 
    } 

    Публичный объект [] Аргументы {получить; установлен; } 

    Общественного типа ImplementationType {получить; частный набор; } 

    Общественного ИНТ заказа {получить; установлен; } 

    Общественного IFilter CreateInstance ([NotNull] IServiceProvider ServiceProvider) 
    { 
        если (this.factory == NULL) 
        { 
            вар argumentTypes = Аргументы .Select (а => a.GetType ()) ?. ToArray (?);

            this.factory = ActivatorUtilities.CreateFactory (ImplementationType, argumentTypes ?? Type.EmptyTypes); 
        } 

        Возвращение (IFilter) this.factory (ServiceProvider, аргументы); 
    } 
}
Скопировать код

В-третьих, заключение

  Кто видел статью на друг я заметил ServiceProvider и ActivatorUtilities  разных по этой статье 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. Введение

  В предыдущих статьях речь идет о инъекции зависимостей (DI) ASP.NET MVC ядра в точке расширения, может быть , мы нашли в ASP.NET CORE Все компоненты через инъекции зависимостей для расширения, но для группы будет функцией набора интерфейсов или абстрактной фабрики , чтобы расширить функциональные возможности , так как IControllerActivator точка функции по этой статье (см исходного кода для .NET ядра ПОЛАГАНИЯ Autofac впрыскивается в собственность Controller) также упоминается, сегодня мы вводим подобные крупные точки расширения, ASP.NET MVC ядра обеспечивает новый механизм для расширения нашей инъекции зависимостей к фильтрам действий (например , фильтры).

Во-вторых, инъекции фильтр зависимость

  В ASP.NET MVC ядра, структура дает нам тип  IFilter  Атрибуты для украшения Действие, действие для перехвата запроса, который имел в предыдущих версиях, но если мы хотим объединить, а затем использовать зависимость инъекций использовать IFilterFactory интерфейс для расширения процесса создания действия фильтра.

  2,1  IFilterFactory определение интерфейса

Интерфейс IFilterFactory общественности: IFilter 
{ 
    IFilter CreateInstance ([NotNull] IServiceProvider ServiceProvider); 
}

 

  Код, который мы хотим, и нужно создать фильтр Атрибут инъекции зависимостей, то как правило, вы хотите:

Скопировать код
общественный класс Фильтровальный: ActionFilterAttribute   
{ 
  общественный Фильтровальный (IDependency1 dependency1, IDependency2 dependency2) 
  { 
    // ... зависимости использование 
  } 
}
Скопировать код

 

  ASP.NET MVC Ядро обеспечивает два простых для нас IFilterFactory ServiceFilterAttribute  и  TypeFilterAttribute  . Будьте примером , чтобы увидеть , как использовать.

Скопировать код
класс HomeController общественности: Controller   
{ 
    [TypeFilter (TypeOf (Фильтровальный))] 
    [ServiceFilter (TypeOf (Фильтровальный))] 
    общественный индекс IActionResult () 
    { 
        вернуться View (); 
    } 
}
Скопировать код

  2,2 ServiceFilterAttribute 

   На самом деле увидеть имя, некоторые друзья будут в состоянии думать, и он основан на введении зависимости от более IFilterFactory , служба усиливает это слово это инъекция зависимости достичь пути получения услуг, мы считаем , что? Не GetService ()? Да, на самом деле, именно этот механизм.

     Для того, чтобы ServiceFilter зарегистрирован на тип контейнера, который будет введен, соответствующий полагаться, как показано в следующем примере, мы должны сначала зарегистрироваться в контейнер типа МОК Фильтровальный.

общественный недействительный ConfigureServices (услуги IServiceCollection) 
{ 
      services.AddSingleton <Фильтровальный> (); 
 
      services.AddMvc () 
}

  Конечно, если тип конструкции требует Фильтровального типа впрыска, но также необходимо зарегистрировать контейнер МОК может быть использовано.

  ServiceFilterAttribute мы посмотрим на исходный код:

Скопировать код
общественный класс ServiceFilterAttribute: Атрибут, IFilterFactory, IOrderedFilter 
{ 
    общественного ServiceFilterAttribute ([NotNull] Тип типа) 
    { 
        ServiceType = тип; 
    } 

    Общественного типа ServiceType {получить; частный набор; } 

    Общественного ИНТ заказа {получить; установлен; } 

    Общественного IFilter CreateInstance ([NotNull] IServiceProvider ServiceProvider) 
    { 
        вар обслуживание = serviceProvider.GetRequiredService (ServiceType); 

        вар фильтр = услуга , как IFilter; 
        если (фильтр == NULL) 
        { 
            певд InvalidOperationException (Resources.FormatFilterFactoryAttribute_TypeMustImplementIFilter (
                TypeOf (ServiceFilterAttribute) .Name, 
                TypeOf (IFilter) .Name)); 
        } 
 
        Вернуть фильтр;
    } 
}
Скопировать код

  2,3  Тип фильтрации гостевой дани

   Конечно , вы можете также выбрать , чтобы использовать этот фильтр аналогично ServiceFilter TypeFilter фильтр, он также реализует IFilterFactory интерфейсы, и может быть использован для создания инъекции зависимостей для фильтрации через него. TypeFilter был назван потому , что ему не нужно , чтобы зарегистрировать тип контейнера может создать фильтр в зависимости инъекций, мы рассмотрим ее код:

Скопировать код
общественный класс TypeFilterAttribute: Атрибут, IFilterFactory, IOrderedFilter 
{ 
    частный ObjectFactory завод; 

    общественного TypeFilterAttribute ([NotNull] Тип) 
    { 
        ImplementationType = тип; 
    } 

    Публичный объект [] Аргументы {получить; установлен; } 

    Общественного типа ImplementationType {получить; частный набор; } 

    Общественного ИНТ заказа {получить; установлен; } 

    Общественного IFilter CreateInstance ([NotNull] IServiceProvider ServiceProvider) 
    { 
        если (this.factory == NULL) 
        { 
            вар argumentTypes = Аргументы .Select (а => a.GetType ()) ?. ToArray (?);

            this.factory = ActivatorUtilities.CreateFactory (ImplementationType, argumentTypes ?? Type.EmptyTypes); 
        } 

        Возвращение (IFilter) this.factory (ServiceProvider, аргументы); 
    } 
}
Скопировать код

В-третьих, заключение

  Кто видел статью на друг я заметил ServiceProvider и ActivatorUtilities  разных по этой статье ServiceFilterAttribute и принцип TypeFilterAttribute заключается в создании фильтра ими, поэтому использование сценариев , чтобы увидеть , как все использовать. На самом деле, я недавно .NET основной исходный код, вы можете увидеть везде интерфейсы, использование фабрики инъекции зависимостей пример формирования точки расширения, на самом деле, предыдущие пункты Microsoft, расширение также с большим количеством коды, но не настолько открытым API, ASP.NET ядро мы видим , «открытую» структуру.

 

  GitHub: https://github.com/maxzhang1985/YOYOFx   если сон также может попросить звезду , приветственное обмен.

 

  .NET Основная группа обучения с открытым исходным кодом:  214 741 894  

 

рекомендация

отwww.cnblogs.com/webenh/p/11605632.html