معرفی
ایجاد وابستگی خودکار همیشه در ASP.NET Core Dependency Injection ترجیح داده می شود، اما وقتی با کدهای قدیمی یا کتابخانه های دیگر کار می کنید، ممکن است همیشه آن گزینه را نداشته باشید. کارخانه های پیاده سازی در ASP.NET Core Dependency Injection کنترل بیشتری بر نحوه ایجاد وابستگی ارائه می دهند. به عنوان مثال، هنگامی که از Builders و Factories برای ایجاد اشیاء وابستگی ها استفاده می کنید، باید از گزینه دیگری غیر از ایجاد وابستگی خودکار استفاده کنید. بیایید ببینیم چگونه می توانیم از Implementation Factories در ASP.NET Core Dependency Injection استفاده کنیم.
استفاده از Implementation Factories برای ثبت وابستگی
برای این مثال، بیایید همان مثال وبسایت تجارت الکترونیکی را که برای مقاله قبلی در مورد ثبت نام و استفاده از چندین پیادهسازی استفاده کردیم، در نظر بگیریم . من در خدماتی که ثبت کرده ام، تغییرات جزئی پشتیبان انجام داده ام. من یک OrderDiscountProcessor دارم که مسئول پردازش تخفیف برای سفارش است. سپس، من یک DiscountBuilder دارم که مسئول ساخت یک شی Discount است که میزان تخفیف و شرایط اعمال آن تخفیف را توضیح می دهد. OrderDiscountProcessor به شی Discount که باید تزریق شود برای محاسبه تخفیف برای سفارش وابسته است. به اندازه کافی ساده، درست است؟
مشکلی که در این مثال داریم، ثبت کلاس Discount به عنوان یک وابستگی برای IDiscountProcessor است. شی Discount باید با استفاده از روش های توسعه ارائه شده توسط DiscountBuilder ساخته شود. بنابراین در این سناریو برای ثبت Discount به عنوان وابستگی باید از Implementation Factories استفاده کنیم.
روشهایی که در IServiceCollection موجود هستند و برای ثبت وابستگیها استفاده میشوند به شما این امکان را میدهند که نمایندهای را تعریف کنید که مسئول ساخت نمونه وابستگی است که میخواهیم ثبت کنیم. نه تنها متدهایی مانند متدهای افزودنی AddScoped()، AddSingleton() در IServiceCollection، بلکه متدهایی مانند TryAddScoped() و حتی اگر از کلاس ServiceDescriptor مستقیماً با متدهای Static یا متدهای کمکی استفاده می کنید، همگی از استفاده از delegate برای ساخت وابستگی پشتیبانی می کنند.
در این مثال، من از متد AddScoped() برای ثبت وابستگی Discount استفاده کرده ام.
- services.AddScoped<IDiscountProcessor, OrderDiscountProcessor>();
- services.AddScoped<Discount>(sp =>
- {
- return new DiscountBuilder()
- .WithMinimumBillAmount(1000)
- .WithMinimumItemCount(3)
- .WithPercentage(10)
- .Build();
- });
اکنون، وابستگی را ثبت کرده ام. در پیادهسازی OrderDiscountProcessor، میتوانم به شی Discount تزریق شده برای محاسبه تخفیف برای یک سفارش معین وابسته باشم.
- public class OrderDiscountProcessor : IDiscountProcessor
- {
- private readonly Discount _discount;
- public OrderDiscountProcessor(Discount discount)
- {
- _discount = discount;
- }
- public double ProcessDiscount(OrderViewModel order)
- {
- double discount = 0.0;
- double totalBill = order.Quantity * order.Price;
- if (order.Quantity >= _discount.MinimumItemCount && totalBill >= _discount.MinimumBillAmount)
- {
- discount = (totalBill * _discount.Percentage) / 100.0;
- }
- return discount;
- }
- }
خلاصه
در این مقاله کوتاه، نحوه استفاده از Implementation Factories را در زمانی که به کنترل بیشتری بر نحوه ایجاد وابستگی ها نیاز دارید، بررسی کردیم. به خصوص زمانی که هیچ کنترلی بر وابستگی که به آن متکی هستید ندارید. این زمانی مفید است که با کدهای قدیمی یا کتابخانه های شخص ثالث کار می کنید که انعطاف کمتری دارند. نمونه برنامه ساده ای که برای نشان دادن این کاربرد استفاده می شود با این مقاله برای دانلود در دسترس است یا می توانید کد منبع را در GitHub در مخزن زیر بیابید.