استفاده از چندین تزریق وابستگی در ASP.NET Core
ثبت و استفاده از چندین تزریق وابستگی در Core ASP.NET
در این مقاله، ما به بررسی نحوه ثبت چندین وابستگی در ASP.NET Core و نحوه استفاده از این وابستگی ها در کلاس های خود با تزریق آنها خواهیم پرداخت.
معرفی
ممکن است شرایطی وجود داشته باشد که شما بخواهید چند وابستگی مشابه را به برنامه تزریق کنید.
برای مثال، اگر شما می خواهید بدون تغییر کد موجود، ویژگی های جدیدی را به برنامه اضافه کنید، بهترین کار برای انجام آن این است که یک پیاده سازی جدید برای آن اضافه کنید. درخواست شما باید به روش خاصی نوشته شود تا این کار درست انجام شود
در این مقاله با یک مثال ساده و کاربردی میتوانید این کار را انجام بدهید
ثبت و استفاده از چندین تزریق وابستگی در Core ASP.NET
در این مقاله، ما به بررسی نحوه ثبت چندین وابستگی در ASP.NET Core و نحوه استفاده از این وابستگی ها در کلاس های خود با تزریق آنها خواهیم پرداخت.
معرفی
ممکن است شرایطی وجود داشته باشد که شما بخواهید چند وابستگی مشابه را به برنامه تزریق کنید.
برای مثال، اگر شما می خواهید بدون تغییر کد موجود، ویژگی های جدیدی را به برنامه اضافه کنید، بهترین کار برای انجام آن این است که یک پیاده سازی جدید برای آن اضافه کنید. درخواست شما باید به روش خاصی نوشته شود تا این کار درست انجام شود.
در این مقاله با یک مثال ساده و کاربردی میتوانید این کار را انجام بدهید.
به عنوان مثال یک وبسایت تجارت الکترونیکی را در نظر بگیرید که در مواردی خاص میخواهد به برخی مشتریان خود تخفیف هایی بدهد
یک اینترفیس به نام IDiscount جهت انجام امور منطقی و محاسبای تخفیف ها در نظر گرفته ایم
و یک IDiscountProcessor جهت فراخوانی تمامی متدهای موجود در IDiscount به کار میبریم
حال جهت تزریق این اینترفیس به پروژه میتوان از روش های زیر استفاده نمود
یکی از روش های موجود استفاده از IServiceCollection است که در آن میتوان تزریق وابستگی با طول عمر را مشخص نمود
مانند:
services.AddScoped();
services.AddScoped();
services.AddScoped();
services.AddScoped();
در اینجا من OrderDiscountProcessor ، IDiscountProcessor و IDiscount را ثبت کرده ام.
این کار خوب است و پاسخ میدهد ، اما مشکلی در پیش دارد و آن اینکه تصور کنید یکی از برنامه نویس ها به طور تصادفی متد SeasonalDiscount را فراخوانی کرده است و نتیجه آن میشود که تخفیف برای تمامی سفارشات دوبار ثبت میشود.
روش بهتر ثبت نام چندین پیاده سازی این است که از روش extension extension TryAddEnumerable داده شده در فضای نام Microsoft.Extensions.DependencyInjection.Extensions استفاده کنید. این پیاده سازی هیچ متد تکراری را دو بار فراخوانی نمیکند و ثبت نمی کند.این تزریق وابستگی کمی متفاوت است که در آن شما نیاز به استفاده از ServiceDeccriptors برای ثبت وابستگی دارید.
services.AddScoped();
services.TryAddEnumerable(new[]
{
ServiceDescriptor.Scoped(),
ServiceDescriptor.Scoped(),
ServiceDescriptor.Scoped()
});
استفاده از چندین تزریق وابستگی با این روش باید حتما نوع داده ای از نوع IENumerable باشد مانند زیر
public class OrderDiscountProcessor : IDiscountProcessor { private readonly IEnumerable _discounts; public OrderDiscountProcessor(IEnumerable discounts) { _discounts = discounts; } // ... }
در اینجا نیز من تمامی مواردی را که به پروژه تزریق کرده ام را مشاهده می نمایید
public (double, List) ProcessDiscount(OrderViewModel order)
{
var discountDiscroptoons = new List();
var totalDiscount = 0.0;
foreach (var discount in _discounts)
{
var addedDiscount = discount.CalculateDiscount(order);
if (addedDiscount > 0)
{
discountDiscroptoons.Add(discount.Description);
}
totalDiscount += addedDiscount;
}
return (totalDiscount, discountDiscroptoons);
}
اکنون همه چیز برای استفاده آماده است.
نتیجه: در این مقاله نگاهی ساده به تزریق چندین وابستگی همنام در پروژه پرداختیم.