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
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