Posinformatique.aspnet.webforms.dependencyInjection est une bibliothèque pour ajouter la prise en charge du conteneur IOC de Microsoft.Extensions.dependencyInjection pour les formulaires Web ASP .NET
Le posinformatique.aspnet.webforms.dependencyInjection est disponible directement sur le site officiel de NuGet. Pour télécharger et installer la bibliothèque sur votre projet Visual Studio en utilisant la ligne de commande NuGet suivante
Install-Package PosInformatique.AspNet.WebForms.DependencyInjection
Après avoir ajouté le package posinformatique.aspnet.webforms.dependencyInjection sur votre projet ASP .NET WebForms Appelez l' AddServiceCollection les lignes suivantes dans le code Application_Start de votre classe HttpApplication dans le code Global.asax.cs derrière:
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 ) ;
}
} Dans le dossier App_Start , ajoutez une nouvelle classe statique appelée ServicesConfig qui permet d'enregistrer les services à l'aide de 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 > ( ) ;
}
}
}Vous pouvez enregistrer des services avec une portée transitoire ou singleton . Contrairement à ASP .NET Core, posinformatique.aspnet.webforms.dependencyInjection ne prend pas en charge les services de portée des lunettes qui existent pendant la durée de vie de la demande HTTP.
Si dans votre application ASP .NET, vous hébergez l'infrastructure ASP .NET Core (à l'aide de la bibliothèque posinformatique.aspnetcore.server.aspnet par exemple), vous pouvez réutiliser le IServiceProvider et IServiceCollection construit en interne par l'ASP .NET Core Infrastructure pour partager les mêmes services (et les mêmes instances Singleton!) Entre votre application ASP .net.
L'exemple suivant, montrez comment réutiliser l' IServiceProvider interne et IServiceCollection de l'application Core ASP .NET hébergée dans ASP .NET à l'aide de la bibliothèque 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 ) ;
}
} La méthode AddDefaultAspNetServices() permet d'ajouter un service d'infrastructure non-core ASP .NET comme le HttpRequest ou HttpContext dans l' IServiceCollection qui sera disponible dans l' IServiceProvider construit par l'infrastructure ASP .NET Core.
La méthode UseServiceProvider() permet de configurer l'infrastructure non-nage ASP .NET pour utiliser la mise en œuvre d' IServiceProvider qui est construite par l' IWebHost de l'infrastructure de base ASP .NET.
Avec cette approche, les composants non-core et principaux ASP .NET partageront le même service. Par exemple, si vous enregistrez un service IDogManager en tant que singleton dans les services d'ASP .NET Core, l'instance de service IDogManager sera disponible et la même instance :
Par défaut, le conteneur d'injection de dépendance Microsoft.Extensions.DendencEntencyInjection utilisera tout constructeur qui correspond aux paramètres du contrôle ou du service à instanciation. Dans la version 2.1 de la bibliothèque Microsoft.Extensions.DependencyInjection, Microsoft a introduit un nouvel attribut ActivatorUtiabilitySconstructorAtTribute qui permet de forcer la bibliothèque IServiceProvider de Microsoft.Extensions.DependanceInjection à appeler explicitement le constructeur décoré.
La version 1.2.0 de la bibliothèque posinformatique.aspnet.webForms.DependencyInjection Ajoutez la prise en charge de l'attribut ActivatorUtitileConstructorAtTribute Même techniquement, cet attribut n'est pas ajouté par le compilateur ASP .NET sur les vues ASPX et ASCX générées.
Par exemple, imaginez que vous avez le contrôle utilisateur suivant:
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()
{
}
}
Lorsque l'application est chargée, le compilateur ASP .NET Générez le code suivant qui n'ajoutera pas l'attribut ActivatorUtilitileConstructorAtTribute sur les constructeurs associés:
public class usercontrolwithdependency_ascx : UserControlWithDependency
{
...
[DebuggerNonUserCode]
public usercontrolwithdependency_ascx()
{
__Init();
}
[DebuggerNonUserCode]
public usercontrolwithdependency_ascx(IDogManager dogManager)
: base(dogManager)
{
__Init();
}
...
}
Le code généré précédent ne peut pas être utilisé correctement par la bibliothèque Microsoft.Extensions.DendencyInjection pour appeler le bon constructeur en fonction de l'activité ConstructorAttribute.
Dans la version 1.2.0 , la posinformatique.aspnet.webForms.dependencyInjection ajoute la prise en charge complète de l'activatoritileConstructorAtTribute en ajoutez pratiquement l'attribut par réflexion dans la classe générée par le compilateur ASP .NET.
Lorsque vous modifiez le constructeur des commandes et des contrôles utilisateur pour injecter des dépendances à l'aide du httpruntime.webObjectActivator, le message suivant peut apparaître lors de l'ajout de ces commandes à une page ou à d'autres contrôles utilisateur:
L'élément 'xxxxx' n'est pas un élément connu. Cela peut se produire s'il y a une erreur de compilation sur le site Web ou si le fichier web.config est manquant .

Dans ce cas, beaucoup d'erreurs / avertissements de contrefaçon peuvent être soulevés par Visual Studio (mais l'application peut compiler avec succès).

De plus, l'intellisense pour le code ASPX pour modifier les propriétés des contrôles ajoutés ne fonctionne pas ...
Ceci est une question connue de Visual Studio et Microsoft Seam à prendre en considération ...
Il existe une solution de contournement, qui est fournie avec le package posinformatique.aspnet.webforms.dependencyInjection en ajoutant un constructeur sans paramètre dans le contrôle:
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 ( ) ;
}
}Remarques : Vous devez également ajouter l'activatorUtibleSconstructorAtTribute sur le constructeur qui nécessite les services enregistrés dans le conteneur Microsoft.Extensions.DependencyInjection. Sans cet attribut, le constructeur sans paramètre peut être utilisé lors de l'exécution de l'application avec le comportement par défaut du Microsoft.Extensions.DependencyInjection.
N'hésitez pas à cloner mon code et à soumettre quelques modifications ... c'est un projet open source, donc tout le monde est le bienvenu pour améliorer cette bibliothèque ... Soit dit en passant, je suis français ... alors peut-être que vous remarquerez que mon anglais n'est pas vraiment couramment ... alors n'hésitez pas à réparer mes chaînes de ressources ou ma documentation ... Merci!
Je tiens à remercier la société de dilitrust pour tester et m'a donné leurs commentaires de cette bibliothèque pour leurs applications ASP .NET WebForms.