Posinformatique.aspnet.webforms.DependencyInjed
Die possinformatique.aspnet.webform.DependencyInjection ist direkt auf der offiziellen Nuget -Website verfügbar. So herunterladen und installieren
Install-Package PosInformatique.AspNet.WebForms.DependencyInjection
Nach dem Hinzufügen des Posformatique.aspnet.Webform.DependencyInjection -Pakets auf Ihrem ASP .NET WebForms -Projekt rufen Sie die AddServiceCollection auf. Die folgenden Zeilen im Application_Start Ihrer HttpApplication -Klasse im Global.asax.cs Code dahinter:
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 ) ;
}
} Fügen Sie im Ordner App_Start eine neue statische Klasse namens ServicesConfig hinzu, mit der die Dienste über die Microsoft.Extensions.DependencyInjection.ServiceCollection registriert werden können:
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 > ( ) ;
}
}
}Sie können Dienste mit einem vorübergehenden oder Singleton -Bereich registrieren. Im Gegensatz zu ASP .NET Core unterstützt posinformatique.aspnet.webform.DependencyInjection keine Scoped -Scope -Dienste, die während der HTTP -Anfragelebensdauer vorliegen.
Wenn Sie in Ihrer ASP .NET -Anwendung die ASP .NET -Kerninfrastruktur (beispielsweise mit der posinformatique.aspnetcore.server.aspnet -Bibliothek) hosten, können Sie die IServiceProvider und IServiceCollection intern wiederverwenden.
Das folgende Beispiel zeigen, wie die interne IServiceProvider und IServiceCollection von ASP .NET -Kernanwendung mithilfe der in ASP .NET gehosteten Possinformatique.aspnetcore.server.aspnet -Bibliothek:
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 ) ;
}
} Mit der AddDefaultAspNetServices() -Methode können ASP .NET Non-Core Infrastructure-Service wie den HttpRequest oder HttpContext in die IServiceCollection hinzugefügt, die in dem von der ASP.NET-Kerninfrastruktur erstellten IServiceProvider verfügbar sein wird.
Mit der Methode UseServiceProvider() können Sie die nicht-kernige ASP .NET-Infrastruktur einrichten, um die Implementierung von IServiceProvider zu verwenden, die vom IWebHost der gestarteten ASP .NET-Kerninfrastruktur erstellt wird.
Mit diesem Ansatz teilen die ASP .NET-Nicht-Kern- und Kernkomponenten denselben Service. Wenn Sie beispielsweise einen IDogManager -Dienst als Singleton in den Diensten von ASP .NET Core registrieren, ist die IDogManager -Serviceinstanz verfügbar und dieselbe Instanz :
Standardmäßig verwendet der Microsoft.Extensions.DependencyInjection -Abhängigkeitsinjektionsbehälter jeden Konstruktor, der mit den Parametern des Steuerelements oder dem Service übereinstimmt. In der Version 2.1 von Microsoft.Extensions.DependencyInjunction Library hat Microsoft ein neues Attribut für activeUtilities -ConstructorAttribute eingeführt, mit dem der IServiceProvider der Microsoft.EXTENSIONS.Desendecyinjection -Bibliothek dazu gezwungen werden kann, den Konstruktor -Dekoration zu rufen.
Die Version 1.2.0 der Possinformatique.aspnet.Webform.DependencyInjed -Bibliothek fügen die Unterstützung des ActivatorUtilitiesConstructorAttribute -Attributs hinzu. Auch technisch wird dieses Attribut nicht vom ASP .NET -Compiler auf den generierten ASPX- und ASCX -Ansichten hinzugefügt.
Stellen Sie sich beispielsweise vor, Sie haben die folgende Benutzersteuerung:
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()
{
}
}
Wenn die Anwendung geladen wird, generieren Sie der ASP .NET -Compiler den folgenden Code, wodurch das Attribut "ActivatorUtilitiesConstructorAttribute" auf den zugeordneten Konstruktoren nicht hinzugefügt wird:
public class usercontrolwithdependency_ascx : UserControlWithDependency
{
...
[DebuggerNonUserCode]
public usercontrolwithdependency_ascx()
{
__Init();
}
[DebuggerNonUserCode]
public usercontrolwithdependency_ascx(IDogManager dogManager)
: base(dogManager)
{
__Init();
}
...
}
Der vorherige generierte Code kann nicht korrekt von den Microsoft.EXtendenssions verwendet werden.
In der Version 1.2.0 fügen die possinformatique.aspnet.webform.DependencyInjection die vollständige Unterstützung des ActivatorUtilitiesConstructorAttribute hinzu, indem das Attribut durch Reflexion in der vom ASP .NET -Compiler generierten Klasse praktisch nachgedacht wird.
Beim Ändern des Konstruktors der Benutzersteuerung und der Steuerung, um Abhängigkeiten mithilfe der httpruntime.webObjectActivator zu injizieren, kann die folgende Nachricht angezeigt werden, wenn diese Steuerelemente zu einer Seite oder anderen Benutzersteuerungen hinzugefügt werden:
Das Element 'xxxxx' ist kein bekanntes Element. Dies kann auftreten, wenn auf der Website ein Kompilierungsfehler vorliegt oder die Datei web.config fehlt .

In diesem Fall können viele Fälschungsfehler /Warnungen von Visual Studio angehoben werden (die Anwendung kann jedoch erfolgreich kompilieren).

Außerdem funktioniert der Intellisense für den ASPX -Code, um die Eigenschaften der zusätzlichen Kontrollen zu bearbeiten, nicht ...
Dies ist eine bekannte Ausgabe von Visual Studio und Microsoft Seam, um sie in Betracht zu ziehen ...
Es gibt eine Problemumgehung, die mit dem Paket für possinformatique.aspnet.webform.DependencyInjection ausgestattet ist, indem ein Konstruktor ohne Parameter in der Steuerung hinzugefügt wird:
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 ( ) ;
}
}Bemerkungen : Sie müssen auch die ActivatorUtilities -ConstructorAttribute zum Konstruktor hinzufügen, für den die in Microsoft registrierten Dienste erforderlich sind. Ohne dieses Attribut kann der Konstruktor ohne Parameter während der Ausführung der Anwendung mit dem Standardverhalten der Microsoft.Extensions.DependencyInjection verwendet werden.
Zögern Sie nicht, meinen Code zu klonen und einige Änderungen einzureichen ... Es ist ein Open -Source -Projekt, also ist jeder willkommen, diese Bibliothek zu verbessern ... Übrigens, ich bin französisch ... vielleicht werden Sie Bemerken, dass mein Englisch nicht wirklich fließend ist ... also zögern Sie nicht, meine Ressourcen -Strings oder meine Dokumentation zu beheben ... Merci!
Ich möchte dem Dilitrust Company bei der Prüfung danken und gab mir ihr Feedback dieser Bibliothek für ihre ASP .NET WebForms -Anwendungen.