posinformatique.aspnet.webforms.DependencyInjection هي مكتبة لإضافة دعم حاوية IOC من Microsoft.Extensions.DependencyInjection لأشعة ASP .NET ويب
يتوفر posinformatique.aspnet.webforms.DependencyInjection مباشرة على موقع Nuget الرسمي. لتنزيل وتثبيت المكتبة على مشروع Visual Studio الخاص بك باستخدام سطر أوامر Nuget التالي
Install-Package PosInformatique.AspNet.WebForms.DependencyInjection
بعد إضافة حزمة posinformatique.aspnet.webforms.dependencying على مشروع ASP .NET WebForms ، اتصل بـ AddServiceCollection الخطوط التالية في Application_Start من فئة HttpApplication الخاصة بك في رمز Global.asax.cs وراء:
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 ) ;
}
} في مجلد App_Start ، أضف فئة ثابتة جديدة تسمى ServicesConfig والتي تسمح بتسجيل الخدمات باستخدام 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 > ( ) ;
}
}
}يمكنك تسجيل الخدمات بنطاق عابر أو مفردة . على عكس ASP .NET Core ، لا يدعم posinformatique.aspnet.webforms.DependencyInjection خدمات النطاق المحدد الموجود خلال فترة طلب HTTP.
إذا كنت في تطبيق ASP .NET الخاص بك ، يمكنك استضافة بنية أساسية ASP .NET الأساسية (باستخدام مكتبة posinformatique.aspnetcore.asserver.aspnet على سبيل المثال) ، يمكنك إعادة استخدام IServiceProvider و IServiceCollection داخليًا من قِبل Asp .net Core Infrastructure لتبادل نفس الخدمات (singlet instance!) طلب.
المثال التالي ، أظهر كيفية إعادة استخدام IServiceProvider الداخلي و IServiceCollection من ASP .NET Core Application المستضافة في ASP .NET باستخدام مكتبة 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 ) ;
}
} تسمح طريقة AddDefaultAspNetServices() بإضافة خدمة البنية التحتية غير الأساسية لـ ASP .NET مثل HttpRequest أو HttpContext في IServiceCollection والتي ستكون متوفرة في IServiceProvider التي تم بناؤها بواسطة ASP .NET Core Infractructure.
تتيح طريقة UseServiceProvider() إعداد البنية التحتية غير الأساسية لـ ASP .NET لاستخدام تنفيذ IServiceProvider الذي يتم بناءه بواسطة IWebHost من البنية التحتية الأساسية لـ ASP .NET.
مع هذا النهج ، ستشارك المكونات غير الأساسية والأساسية ASP .NET في نفس الخدمة. على سبيل المثال ، إذا قمت بتسجيل خدمة IDogManager كـ Singleton في خدمات ASP .NET Core ، فسيتوفر مثيل خدمة IDogManager ونفس الحالة :
افتراضيًا ، ستستخدم حاوية حقن التبعية Microsoft.Extensions.DependencyInjection أي مُنشئ يتطابق مع معلمات التحكم ، أو الخدمة المرفقة. في الإصدار 2.1 من مكتبة Microsoft.Extensions.DependencyInjection ، قدمت Microsoft سمة AmploSatorUtabilitiesConstructorattribute جديدة والتي تسمح بإجبار IServiceProvider من Microsoft.Extensions.DependencyInjection على الاتصال بشكل واضح على البناء.
تضيف الإصدار 1.2.0 من مكتبة posinformatique.aspnet.webforms.DependencyInjection دعم سمة ActipatorUtialsConstructorAttribute حتى من الناحية الفنية لم تتم إضافة هذه السمة بواسطة ASP .NET مترجم على طرق عرض ASPX و ASCX التي تم إنشاؤها.
على سبيل المثال ، تخيل أن لديك عنصر تحكم المستخدم التالي:
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()
{
}
}
عند تحميل التطبيق ، يقوم برنامج التحويل البرمجي ASP .NET بإنشاء الكود التالي الذي لن يضيف سمة ActivatorUTALITIALSCORNTRUCTORTTRIBUTE على البنائين المرتبطة:
public class usercontrolwithdependency_ascx : UserControlWithDependency
{
...
[DebuggerNonUserCode]
public usercontrolwithdependency_ascx()
{
__Init();
}
[DebuggerNonUserCode]
public usercontrolwithdependency_ascx(IDogManager dogManager)
: base(dogManager)
{
__Init();
}
...
}
لا يمكن استخدام الكود السابق الذي تم إنشاؤه بشكل صحيح بواسطة مكتبة Microsoft.Extensions.DependencyInjection للاتصال بالمقدم المناسب بناءً على المنشطات.
في الإصدار 1.2.0 ، أضف posinformatique.aspnet.webforms.DependencyInjection الدعم الكامل لعملية AgencorUtabilitiesConstructorAttribute عن طريق إضافة السمة تقريبًا عن طريق الانعكاس في الفئة التي تم إنشاؤها بواسطة برنامج التحويل البرمجي ASP .NET.
عند تغيير مُنشئ عناصر تحكم المستخدم والتحكم في حقن التبعيات باستخدام httpruntime.webObjectActivator ، يمكن أن تظهر الرسالة التالية عند إضافة عناصر التحكم هذه إلى صفحة أو عناصر تحكم مستخدم أخرى:
عنصر "xxxxx" ليس عنصرًا معروفًا. يمكن أن يحدث هذا إذا كان هناك خطأ في التجميع في موقع الويب ، أو مفقود ملف web.config .

في هذه الحالة ، يمكن رفع الكثير من الأخطاء /التحذيرات من قبل Visual Studio (ولكن يمكن أن يتم تجميع التطبيق بنجاح).

أيضًا ، لا يعمل Intellisense لرمز ASPX لتحرير خصائص عناصر التحكم المضافة ...
هذه قضية معروفة من Visual Studio و Microsoft Seam لاتخاذها قيد النظر ...
هناك حل بديل ، يتم توفيره مع حزمة posinformatique.aspnet.webforms.DependencyInjection عن طريق إضافة مُنشئ بدون معلمة في عنصر التحكم:
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 ( ) ;
}
}الملاحظات : عليك أيضًا إضافة ActivatorUtabilitiesConstructorattribute على المُنشئ الذي يتطلب الخدمات المسجلة في حاوية microsoft.extensions.dependencyinjection. بدون هذه السمة ، يمكن استخدام المنشئ بدون معلمة أثناء تنفيذ التطبيق مع السلوك الافتراضي لـ microsoft.extensions.dependencyInjection.
لا تتردد في استنساخ الكود الخاص بي وتقديم بعض التغييرات ... إنه مشروع مفتوح المصدر ، لذلك كل شخص مرحب به لتحسين هذه المكتبة ... بالمناسبة ، أنا فرنسي ... لذلك ربما ستلاحظ أن لغتي الإنجليزية ليست بطلاقة حقًا ... لذلك لا تتردد في إصلاح سلاسل الموارد الخاصة بي أو وثائقي ... Merci!
أود أن أشكر شركة Dilitrust للاختبار وأعطاني ملاحظاتهم حول هذه المكتبة على تطبيقات WebForms ASP .NET.