PosInFormatque.aspnet.webforms.dependencyInjection adalah perpustakaan untuk menambahkan dukungan wadah IOC dari microsoft.extensions.dependencyInjection untuk Asp .net Web Formulir Web
PosinFormatque.aspnet.webforms.dependencyInjection tersedia langsung di situs web resmi Nuget. Untuk mengunduh dan menginstal perpustakaan ke proyek Visual Studio Anda menggunakan baris perintah NUGET berikut
Install-Package PosInformatique.AspNet.WebForms.DependencyInjection
Setelah menambahkan paket PosInFormatique.aspnet.webforms.dependencyInjection pada proyek ASP .NET WebForms Anda memanggil AddServiceCollection baris berikut di Application_Start dari kelas HttpApplication Anda di Global.asax.cs Code di belakang:
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 ) ;
}
} Di folder App_Start tambahkan kelas statis baru yang disebut ServicesConfig yang memungkinkan untuk mendaftarkan layanan menggunakan 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 > ( ) ;
}
}
}Anda dapat mendaftarkan layanan dengan ruang lingkup sementara atau singleton . Berbeda dengan ASP .NET Core, posinformatique.aspnet.webforms.dependencyInjection tidak mendukung layanan ruang lingkup lingkup yang ada selama seumur hidup permintaan HTTP.
Jika dalam aplikasi ASP .NET Anda Anda meng -host infrastruktur inti ASP .NET (menggunakan pustaka posinformatique.aspnetcore.server.aspnet misalnya), Anda dapat menggunakan kembali IServiceProvider dan IServiceCollection yang sama. aplikasi yang di -host.
Contoh berikut, tunjukkan cara menggunakan kembali IServiceProvider internal dan IServiceCollection dari Asp .NET Core Application yang di -host di ASP .NET menggunakan POSInFormatque.aspnetcore.server.aspnet Library:
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 ) ;
}
} Metode AddDefaultAspNetServices() memungkinkan untuk menambahkan ASP .NET Non-Core Infrastructure Service seperti HttpRequest atau HttpContext ke dalam IServiceCollection yang akan tersedia di IServiceProvider yang dibangun oleh infrastruktur inti ASP .net.
Metode UseServiceProvider() memungkinkan untuk mengatur infrastruktur non-inti ASP .NET untuk menggunakan implementasi IServiceProvider yang ditolak oleh IWebHost dari infrastruktur inti ASP .NET dimulai.
Dengan pendekatan ini, komponen non-inti dan inti ASP .NET akan berbagi layanan yang sama . Misalnya, jika Anda mendaftarkan Layanan IDogManager sebagai Singleton dalam layanan ASP .NET Core, instance Layanan IDogManager akan tersedia dan contoh yang sama :
Secara default, wadah injeksi ketergantungan Microsoft.Extensions.DependencyInjection akan menggunakan konstruktor apa pun yang sesuai dengan parameter kontrol, atau layanan untuk membuat instantiate. Dalam versi 2.1 dari Microsoft.Extensions. Perpustakaan DependencyInjection, Microsoft telah memperkenalkan atribut ActivatorutilitiesConstructorTribute baru yang memungkinkan untuk memaksa IServiceProvider dari Microsoft.Extensions. Perpustakaan DependencyInjection untuk memanggil secara eksplisit konstruktor yang diasah.
Versi 1.2.0 dari pustaka posinformatique.aspnet.webforms.dependencyInjection Library Tambahkan dukungan dari ActivatorutilitiesConstructorAttribute Atribut Bahkan secara teknis atribut ini tidak ditambahkan oleh kompiler ASP .NET pada tampilan ASPX dan ASCX yang dihasilkan.
Misalnya, bayangkan Anda memiliki kontrol pengguna berikut:
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()
{
}
}
Saat aplikasi dimuat, kompiler ASP .NET menghasilkan kode berikut yang tidak akan menambahkan atribut ActivatorutilitiesConstructorAttribute pada konstruktor yang terkait:
public class usercontrolwithdependency_ascx : UserControlWithDependency
{
...
[DebuggerNonUserCode]
public usercontrolwithdependency_ascx()
{
__Init();
}
[DebuggerNonUserCode]
public usercontrolwithdependency_ascx(IDogManager dogManager)
: base(dogManager)
{
__Init();
}
...
}
Kode yang dihasilkan sebelumnya tidak dapat digunakan dengan benar oleh Microsoft.Extensions.DependencyInjection Library untuk memanggil konstruktor yang tepat berdasarkan ActivatorutilitiesConstructorAttribute.
Dalam versi 1.2.0 , posinformatique.aspnet.webforms.dependencyIntipsion Tambahkan dukungan penuh dari ActivatorutilitiesConstructorAttribute dengan menambahkan atribut dengan refleksi di kelas yang dihasilkan oleh kompiler ASP .net.
Saat mengubah konstruktor kontrol dan kontrol pengguna untuk menyuntikkan dependensi menggunakan httpruntime.webObjectivator, pesan berikut dapat muncul saat menambahkan kontrol ini ke halaman atau kontrol pengguna lainnya:
Elemen 'xxxxx' bukan elemen yang diketahui. Ini dapat terjadi jika ada kesalahan kompilasi di situs web, atau file web.config tidak ada .

Dalam hal ini, banyak kesalahan/peringatan palsu dapat diangkat oleh Visual Studio (tetapi aplikasi dapat dikompilasi dengan sukses).

Juga, Intellisense untuk kode ASPX untuk mengedit properti kontrol yang ditambahkan tidak berfungsi ...
Ini adalah masalah Visual Studio dan Microsoft Seam yang diketahui untuk dipertimbangkan ...
Ada solusi, yang dilengkapi dengan paket posinformatique.aspnet.webforms.dependencyInjection Paket dengan menambahkan konstruktor tanpa parameter di kontrol:
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 ( ) ;
}
}Keterangan : Anda juga harus menambahkan ActivatorutilitiesConstructorAttribute pada konstruktor yang mensyaratkan layanan yang terdaftar dalam wadah Microsoft.Extensions.DependencyInjection. Tanpa atribut ini, konstruktor tanpa parameter dapat digunakan selama pelaksanaan aplikasi dengan perilaku default dari microsoft.Extensions.DependencyInjection.
Jangan ragu untuk mengkloning kode saya dan mengirimkan beberapa perubahan ... Ini adalah proyek open source, jadi semua orang dipersilakan untuk meningkatkan perpustakaan ini ... ngomong -ngomong, saya orang Prancis ... jadi mungkin Anda akan berkomentar bahwa bahasa Inggris saya tidak terlalu fasih ... jadi jangan ragu untuk memperbaiki string sumber daya saya atau dokumentasi saya ... Merci!
Saya ingin mengucapkan terima kasih kepada perusahaan Dilitrust untuk menguji dan memberi saya umpan balik mereka tentang perpustakaan ini untuk aplikasi Asp .NET WebForms mereka.