Posinformatique.aspnet.webforms.dependencyInjection es una biblioteca para agregar el soporte de contenedor IOC de microsoft.extensions.dependencyInyection para los formularios web ASP .NET .NET
PosInformatique.aspnet.webforms.dependencyInyection está disponible directamente en el sitio web oficial de NUGET. Para descargar e instalar la biblioteca en su proyecto Visual Studio utilizando la siguiente línea de comandos Nuget
Install-Package PosInformatique.AspNet.WebForms.DependencyInjection
Después de agregar el paquete PosInformatique.aspnet.webforms.dependencyInyection en su llamada del proyecto ASP .NET WebForms Llame al AddServiceCollection las siguientes líneas en la Application_Start de su clase HttpApplication en el código Global.asax.cs detrás:
public class Global : HttpApplication
{
protected void Application_Start ( Object sender , EventArgs e )
{
ServicesConfig . RegisterServices ( this . AddServiceCollection ( ) ) ;
// Code that runs on application startup
RouteConfig . RegisterRoutes ( RouteTable . Routes ) ;
BundleConfig . RegisterBundles ( BundleTable . Bundles ) ;
}
} En la carpeta App_Start , agregue una nueva clase estática llamada ServicesConfig que permite registrar los servicios utilizando Microsoft.Extensions.DependencyInjection.ServiceCollection :
namespace PosInformatique . AspNet . WebForms . DependencyInjection . IntegrationTests
{
using System ;
using System . Collections . Generic ;
using System . Collections . ObjectModel ;
using System . Linq ;
using Microsoft . Extensions . DependencyInjection ;
public static class ServicesConfig
{
public static void RegisterServices ( IServiceCollection serviceCollection )
{
serviceCollection . AddSingleton < IDogRepository , DogRepository > ( ) ;
serviceCollection . AddTransient < IDogManager , DogManager > ( ) ;
}
}
}Puede registrar servicios con un alcance transitorio o singleton . A diferencia de ASP .NET Core, PosInformatique.aspnet.webforms.dependencyInyection no admite servicios de alcance de alcance que existe durante la vida útil de la solicitud HTTP.
Si en su aplicación ASP .NET, aloja la infraestructura Core ASP .NET (utilizando la biblioteca PosInformatique.aspnetcore.server.aspnet, por ejemplo), puede reutilizar el IServiceProvider y IServiceCollection internamente entre la aplicación ASP .NET Core infraestructura para compartir los mismos servicios (¡y los mismos Inestenios singleton!)
El siguiente ejemplo, muestre cómo reutilizar el IServiceProvider interno e IServiceCollection de la aplicación ASP .NET Core alojada en ASP .NET utilizando la biblioteca posinformatique.aspnetcore.server.aspnet:
public class Global : System . Web . HttpApplication
{
protected void Application_Start ( object sender , EventArgs e )
{
var host = WebHost . CreateDefaultBuilder ( )
. UseAspNet ( options =>
{
options . Routes . Add ( "api" ) ;
options . Routes . Add ( "swagger" ) ;
} )
. ConfigureServices ( services =>
{
// Add the default ASP .NET non-core services
// in the IServiceCollection of ASP .NET core.
services . AddDefaultAspNetServices ( this ) ;
} )
. UseStartup < Startup > ( )
. Start ( ) ;
// Reuse the built IServiceProvider of ASP .NET Core WebHost inside
// the ASP .NET non-core infrastructure to use IoC feature.
this . UseServiceProvider ( host ) ;
}
} El método AddDefaultAspNetServices() permite agregar ASP .NET .NET Servicio de infraestructura no coreal como HttpRequest o HttpContext en la IServiceCollection que estará disponible en el IServiceProvider construido por la infraestructura central ASP .NET.
El método UseServiceProvider() permite configurar la infraestructura ASP .NET no core para usar la implementación de IServiceProvider que está superada por el IWebHost de la infraestructura central ASP .NET comenzó.
Con este enfoque, los componentes ASP .NET no básicos y centrales compartirán el mismo servicio. Por ejemplo, si registra un servicio IDogManager como Singleton en los servicios de ASP .NET Core, la instancia del servicio IDogManager estará disponible y la misma instancia :
De manera predeterminada, el contenedor de inyección de dependencia de Microsoft.Extensions.PependencyInyection usará cualquier constructor que coincida con los parámetros del control o el servicio para instanciar. En la versión 2.1 de Microsoft.Extensions.dependencyInsyection Biblioteca, Microsoft ha introducido un nuevo atributo ActiveatorUtitityConstructorAttribute que permite forzar el IServiceProvider de Microsoft.extensions.Pendencying Library para llamar explícitamente el constructor decorado.
La versión 1.2.0 del Posinformatique.aspnet.webforms.dependencyInection Biblioteca Agregue el soporte del atributo ActiveatorUtitityConstructorAttribute incluso técnicamente este atributo no agrega el compilador ASP .NET en las vistas ASPX y ASCX generadas.
Por ejemplo, imagine que tiene el siguiente control del usuario:
public partial class UserControlWithDependency : System.Web.UI.UserControl
{
private readonly IDogManager dogManager;
[ActivatorUtilitiesConstructor] // Will be call by the IServiceProvider of the Microsoft.Extensions.DependencyInjection library.
public UserControlWithDependency(IDogManager dogManager)
{
this.dogManager = dogManager;
}
public UserControlWithDependency()
{
}
}
Cuando se carga la aplicación, el compilador ASP .NET genera el siguiente código que no agregará el atributo ActiveatorUtitiesConstructorAttribute en los constructores asociados:
public class usercontrolwithdependency_ascx : UserControlWithDependency
{
...
[DebuggerNonUserCode]
public usercontrolwithdependency_ascx()
{
__Init();
}
[DebuggerNonUserCode]
public usercontrolwithdependency_ascx(IDogManager dogManager)
: base(dogManager)
{
__Init();
}
...
}
El código generado anterior no puede ser utilizado correctamente por Microsoft.Extensions.PependencyInyection Biblioteca para llamar al constructor correcto en función del ActivatorUtitiesConstructorAttribute.
En la versión 1.2.0 , el posinformatique.aspnet.webforms.dependencyInyection agregue el soporte completo del activatorUtitiesConstructorAttribute mediante virtualmente agregue el atributo por reflexión en la clase generada por el compilador ASP .NET.
Al cambiar el constructor de los controles del usuario y el control para inyectar dependencias utilizando httpruntime.webobjectActivator, el siguiente mensaje puede aparecer al agregar estos controles a una página u otros controles de usuario:
El elemento 'xxxxx' no es un elemento conocido. Esto puede ocurrir si hay un error de compilación en el sitio web o falta el archivo web.config .

En este caso, Lots de errores/advertencias falsas puede ser planteada por Visual Studio (pero la aplicación puede compilarse con éxito).

Además, el Intellisense para el código ASPX para editar las propiedades de los controles agregados no funciona ...
Este es un problema conocido de Visual Studio y Microsoft Seam para tener en cuenta ...
Hay solución alternativa, que se proporciona con el paquete PosInformatique.aspnet.webforms.dependencyInyection agregando un constructor sin parámetro en el control:
public partial class UserControlWithDependency : System . Web . UI . UserControl
{
private readonly IDogManager dogManager ;
[ ActivatorUtilitiesConstructor ] // It is import to set this attribute to be sure this constructor will be called by the Microsoft.Extensions.DependencyInjection.
public UserControlWithDependency ( IDogManager dogManager )
{
this . dogManager = dogManager ;
}
// Avoid the errors and the warnings in the Visual Studio ASPX code designer
public UserControlWithDependency ( )
{
}
protected void Page_Load ( object sender , EventArgs e )
{
this . doggoList . DataSource = this . dogManager . GetDogs ( ) ;
this . doggoList . DataBind ( ) ;
}
}Observaciones : también debe agregar el ActivatorUtitiesConstructorAttribute en el constructor que requiere los servicios registrados en el contenedor de Microsoft.Extensions.dependencyInjection. Sin este atributo, el constructor sin parámetro se puede usar durante la ejecución de la aplicación con el comportamiento predeterminado de Microsoft.extensions.dependencyInject.
No dude en clonar mi código y enviar algunos cambios ... es un proyecto de código abierto, por lo que todos pueden mejorar esta biblioteca ... Por cierto, soy francés ... así que tal vez comentes que mi inglés no es realmente fluido ... así que no dudes en arreglar mis cadenas de recursos o mi documentación ... ¡Merci!
Quiero agradecer a la compañía Dilitrust para probar y me dio sus comentarios sobre esta biblioteca por sus aplicaciones ASP .NET WebForms.