Middle
Контейнерҳои IoC чистанд ва онҳо дар таҳияи C# чӣ нақш мебозанд?
sobes.tech AI
Ҷавоб аз AI
Контейнерهای IoC (Inversion of Control) چارچوبهایی هستند که چرخه حیات و وابستگیهای اشیاء در برنامه را مدیریت میکنند. آنها اصل معکوس کنترل را پیادهسازی میکنند، با واگذاری ساخت و مدیریت اشیاء به کانتینر، نه کد که این اشیاء را استفاده میکند.
نقش در توسعه با C#:
- مدیریت وابستگیها: کانتینرهای IoC به صورت خودکار وابستگیها (اشیاء دیگر که به آن شیء وابسته است) را هنگام ساخت آن وارد میکنند. این نیاز به ساخت و انتقال دستی وابستگیها را برطرف میکند.
// بدون IoC public class MyService { private readonly IDependency _dependency; public MyService() { _dependency = new ConcreteDependency(); // ساخت دستی وابستگی } } // با IoC public class MyService { private readonly IDependency _dependency; // وابستگی توسط کانتینر وارد میشود public MyService(IDependency dependency) // سازنده برای وارد کردن وابستگی { _dependency = dependency; } } - باز کردن وابستگیها (decoupling): کانتینرهای IoC کمک میکنند تا ماژولهای سطح بالا از سطح پایین جدا شوند، که به کاهش وابستگی کمک میکند. کلاسها بر اساس انتزاعات (رابطها) وابسته هستند، نه پیادهسازیهای خاص. کانتینر مسئول اتصال انتزاع به پیادهسازی مورد نیاز است.
- سادهسازی تست: از آنجا که وابستگیها از بیرون وارد میشوند، میتوان اشیاء موک یا جایگزینها را هنگام نوشتن تستهای واحد به راحتی جایگزین کرد.
- مدیریت چرخه حیات: کانتینر میتواند نحوه ساخت نمونههای اشیاء را کنترل کند (مثلاً هر بار جدید، یک نمونه برای برنامه (singlton)، یک نمونه بر اساس درخواست و غیره).
// نمونه پیکربندی در کانتینر (انتزاع، ممکن است در فریمورکهای مختلف متفاوت باشد) //builder.RegisterType<ConcreteDependency>().As<IDependency>().SingleInstance(); // سینگلتون //builder.RegisterType<ConcreteDependency>().As<IDependency>().InstancePerDependency(); // هر بار جدید - پیکربندی و توسعهپذیری: پیکربندی ارتباطات بین انتزاعات و پیادهسازیها میتواند در جای جداگانهای قرار گیرد، که تغییر رفتار برنامه را بدون تغییر کد اصلی آسان میکند.
کنتینرهای IoC محبوب در اکوسیستم C#: Autofac، Ninject، StructureMap (منسوخ شده)، Unity، Microsoft.Extensions.DependencyInjection (درونساخته در .NET Core و .NET 5+).