ASP.NET Core - en la inyección de dependencias utilizando ActionFilter

Última ActionFilter causada por una anomalía EF , en esencia, es una versión de la base de conocimientos no ActionFilter buen conocimiento de causa suficiente, se tomó el tiempo para leer la documentación oficial de Microsoft. Además de los problemas encontrados IActionFilter, IAsyncActionFilter, hay un lugar en la inyección de dependencias uso ActionFilter también hay que prestar atención.
Cuando nuestra necesidad ActionFilter utilizar un servicio, que generalmente se inyecta a través del constructor.
Demuestra que, personalizar una primera ActionFilter, IMyService inyecta a través del constructor:

    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());
        }
    }

Pero nosotros VS dada directamente al utilizar puntas rojas de atributos, necesidad de pasar argumentos al constructor, o no se puede compilar en el pasado.

Por supuesto, podemos directamente a MyService como un nuevo parámetro, pero está claro que los que perdieron los beneficios de la inyección.

En uso ActionFilter inyección de dependencias

Hay dos maneras de utilizar la inyección de dependencia en ASP.NET Núcleo de ActionFilter en:

  1. ServiceFilterAttribute
  2. TypeFilterAttribute

ServiceFilterAttribute

Uso ServiceFilterAttribute puede hacer que su inyección de dependencia completa ActionFilter. De hecho, desea utilizar ActionFilter sí registra como un servicio registrado el contenedor DI. Recuperando su ActionFilter del recipiente a través ServiceFilter, y se inyecta cuando sea necesario. Así que el primer paso es registrar su ActionFilter:

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

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

A continuación, cree un nuevo uso ServiceFilter controlador, en acción:

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

            return "DI";
        }

Corriendo, ruta en el navegador en el marco del acceso correspondiente, se puede ver MyService ha sido inyectado en el FilterInjectAttribute en:

ServiceFilterAttribute de atributos IsReusable:

ServiceFilter tiene una propiedad llamada IsReusable. Se entiende bien del significado literal, es decir, si significado reutilizable. Si esta propiedad obvia se establece en True, las múltiples solicitudes se vuelva a usar este ActionFilter, Es un poco como una media Singleton.

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

            return "DI";
        }

Ejecutarlo varias veces para acceder a la acción correspondiente en la trayectoria del navegador, se puede ver FilterInjectAttribute constructor de una sola vez.

Hay un consejos importantes, ASP.NET Core Runtime no garantiza que el filtro es un verdadero producto único . Así que no se tratan de utilizar esta propiedad para lograr un producto único, y los sistemas de negocio se basan en este único caso.

TypeFilterAttribute

Uso TypeFilterAttribute también puede hacer que su inyección de dependencia completa ActionFilter. Se ServiceFilterAttribute con similar, pero no el uso de TypeFilterAttribute inyectaron ActionFilter Encuentra contenedor DI, sino directamente a una instancia de un objeto por Microsoft.Extensions.DependencyInjection.ObjectFactory. Así que no es necesario registrarse con antelación a FilterInjectAttribute contenedor de DI.
Primero comente código de registro FilterInjectAttribute:

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

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

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

En lugar TypeFilterAttribute:

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

            return "DI";
        }

Corriendo, ruta en el navegador en el marco del acceso correspondiente, se puede ver MyService ha sido inyectado en el FilterInjectAttribute en:

TypeFilterAttribute de atributos IsReusable:

Al igual que con el anterior ServiceFilter, ASP.NET Core Runtime no garantiza que este filtro es realmente un caso único , no más largo aliento-aquí.

TypeFilterAttribute es propiedad Argumentos:

Argumentos de los parámetros es un TypeFilterAttribute con ServiceFilterAttribute diferencia importante, no ServiceFilterAttribute esta propiedad. Argumentos de matriz de tipo de objeto. Si su tipo de parámetro constructor encuentra en el DI recipiente, continuaremos recibir los argumentos secuencialmente por la lista de instanciado TypeFilterAttribute ActionFilter.
El constructor cambio FilterInjectAttribute pluralidad añade dos parámetros, y los dos parámetros no se puede garantizar de la DI ha podido recuperar:

    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 .");
        }
    }

Entrante cuando se utilizan dos parámetros:

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

            return "DI";
        }

Ejecución de ver a dos parámetros son introducidos a FilterInjectAttribute constructor:

resumen

  1. ActionFilterAttribute inyección de dependencia se puede conseguir mediante ServiceFilterAttribute, TypeFilterAttribute
  2. ServiceFilterAttribute es administrado por DI ActionFilterAttribute contenedor; TypeFilterAttribute se crea una instancia de una planta directamente, no está obligado a registrarse antes de su uso contenedor DI.
  3. propiedades IsReusable función similar se pueden conseguir en una sola forma de realización, pero no garantiza que el único solo de tiempo de ejecución de realización.
  4. Argumentos TypeFilterAttribute propiedad puede ser utilizada como la lista de parámetros. Si los tipos de parámetros del constructor no están registrados en DI entonces se intentará extraer el contenedor de la lista cuando Argumentos ActionFilterAttribute la instanciados.

Supongo que te gusta

Origin www.cnblogs.com/kklldog/p/di-in-core-actionfilter.html
Recomendado
Clasificación