به چه طریق میتوان تزریق وابستگی را بصورت خودکار انجام داد؟
نویسنده: هادی مزارعی
تاریخ: ۱۴۰۴/۱۰/۱۶ ۱۰:۵۴
آدرس: www.dntips.ir
Constructor) سرویس مورد نظر را به عنوان پارامتر ورودی تعریف کرده باشم، مطابق روال عادی و در زمان نمونهسازی از کلاس باید سرویس را به عنوان پارامتر ارسال کنم. آیا روشی وجود دارد که دو متد سازنده تعریف کنم (یکی بدون پارامتر) که در زمان نمونه سازی، بصورت خودکار سرویس از طریق سازندهی دارای پارامتر، سرویس خود را دریافت نماید. میدونم این امکان وجود داره که در متد سازندهی بدون پارامتر با استفاده از this یکی از متدهای سازنده را اجرا کنم که در داخل آن با استفاده از GetRequiredService، سرویس مورد نظر را دریافت و به متغیرهای خصوص تخصیص بدم.public MyClass(IService service)
{
_service = service;
}
public MyClass() : this(GetServiceFromContainer())
{
}ServiceCollection ثبت شده باشد) جهت تزریق خودکار وجود دارد؟Microsoft.Extensions.DependencyInjection) دارای منطقی برای انتخاب سازنده (Constructor) مناسب در زمان نمونهسازی یک سرویس است:IServiceCollection (مثلاً در متد ConfigureServices یا Program.cs) ثبت کردهاید، داشته باشد.public MyClass(IService service)) و دیگری بدون پارامتر (public MyClass()).MyClass را در کانتینر ثبت کرده باشید:services.AddTransient<MyClass>();
serviceProvider.GetRequiredService) یا آن را به عنوان وابستگی به کلاس دیگری تزریق کنید:public MyClass(IService service) را انتخاب میکند، چون:IService را میتواند حل کند (زیرا شما آن را قبلاً ثبت کردهاید).GetServiceFromContainer() به آن تزریق میشود.new نمونهسازی کنید (خارج از حوزهی کانتینر DI):var myInstance = new MyClass(); // سازندهی بدون پارامتر فراخوانی میشود
this(GetServiceFromContainer()) که خودتان مثال زدید، وجود ندارد.new و استفادهی انحصاری از کانتینر DI است. اگر میخواهید تزریق اتوماتیک انجام شود، کلاس خود را ثبت کنید:services.AddScoped<MyClass>(); // یا AddTransient/AddSingleton services.AddScoped<IService, ServiceImplementation>();
public class MyClass
{
private readonly IService _service;
public MyClass(IService service) // فقط همین سازنده
{
_service = service;
}
// ...
}GetServiceFromContainer() یا الگوهای مشابه (مانند Service Locator) تنها راهکار عملی برای پر کردن وابستگیها در سازندهی بدون پارامتر است، اما در کل به عنوان یک ضدالگو (Anti-Pattern) توصیه نمیشود، زیرا کلاس شما را به کانتینر DI وابسته میکند.