Saltar al contenido

Cómo usar la inyección de dependencia con ASP.NET Web Forms

Solución:

ACTUALIZACIÓN 2019: Con la introducción de Web Forms 4.7.2, ahora hay un mejor soporte para DI. Esto invalida lo siguiente. Consulte: Conexión de inyector simple en WebForms en .NET 4.7.2

Puede usar la inyección automática del constructor reemplazando el valor predeterminado PageHandlerFactory con uno personalizado. De esta forma, puede utilizar un constructor sobrecargado para cargar las dependencias. Su página podría verse así:

public partial class HomePage : System.Web.UI.Page
{
    private readonly IDependency dependency;

    public HomePage(IDependency dependency)
    {
        this.dependency = dependency;
    }

    // Do note this protected ctor. You need it for this to work.
    protected HomePage () { }
}

Configurando esa costumbre PageHandlerFactory se puede hacer en web.config de la siguiente manera:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <httpHandlers>
      <add verb="*" path="*.aspx"
        type="YourApp.CustomPageHandlerFactory, YourApp"/>
    </httpHandlers>
  </system.web>
</configuration>

Tu CustomPageHandlerFactory puede verse así:

public class CustomPageHandlerFactory : PageHandlerFactory
{
    private static object GetInstance(Type type)
    {
        // TODO: Get instance using your favorite DI library.
        // for instance using the Common Service Locator:
        return Microsoft.Practices.ServiceLocation
            .ServiceLocator.Current.GetInstance(type);
    }

    public override IHttpHandler GetHandler(HttpContext cxt, 
        string type, string vPath, string path)
    {
        var page = base.GetHandler(cxt, type, vPath, path);

        if (page != null)
        {
            // Magic happens here ;-)
            InjectDependencies(page);
        }

        return page;
    }

    private static void InjectDependencies(object page)
    {
        Type pageType = page.GetType().BaseType;

        var ctor = GetInjectableCtor(pageType);

        if (ctor != null)
        {
            object[] arguments = (
                from parameter in ctor.GetParameters()
                select GetInstance(parameter.ParameterType)
                .ToArray();

            ctor.Invoke(page, arguments);
        }
    }

    private static ConstructorInfo GetInjectableCtor(
        Type type)
    {
        var overloadedPublicConstructors = (
            from constructor in type.GetConstructors()
            where constructor.GetParameters().Length > 0
            select constructor).ToArray();

        if (overloadedPublicConstructors.Length == 0)
        {
            return null;
        }

        if (overloadedPublicConstructors.Length == 1)
        {
            return overloadedPublicConstructors[0];
        }

        throw new Exception(string.Format(
            "The type {0} has multiple public " +
            "ctors and can't be initialized.", type));
    }
}

La desventaja es que esto solo funciona cuando se ejecuta a su lado en Full Trust. Puedes leer más sobre esto aquí. Pero tenga en cuenta que el desarrollo de aplicaciones ASP.NET con confianza parcial parece una causa perdida.

Autofac admite la inyección de dependencia bastante discreta en ASP.NET WebForms. Tengo entendido que simplemente se conecta al ciclo de vida de la página ASP.NET utilizando un módulo http y realiza la inyección de propiedades. El único inconveniente es que para los controles no creo que esto suceda hasta después el evento Init.

A partir de .NET 4.7.2 (novedades), ahora es fácil para los desarrolladores utilizar la inyección de dependencia en las aplicaciones de WebForms. Con UnityAdapter, puede agregarlo a su aplicación WebForms existente en 4 sencillos pasos. Vea este blog.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *