تزریق وابستگی (Dependency injection) توسط AutoFac در ASP.Net
شنبه 23 آبان 1394AutoFac یک کتابخانه در زمینه تزریق وابستگی هاست . ASP.NET 5یک سازو کار توکار برای پشتیبانی از DI و یا همان Dpendency Injectionدارد .ولی قصد داریم به جای این از Auto Fac استفاده کنیم .
در این مقاله قصد داریم راجع به تزریق وابستگی Auto Fac صحبت کنیم .قبل از شروع بحث بهتر است راجع به مفهوم IOC سرنام عبارت Inversion Of Control صحبت کنیم .معنی لغوی این عبارت واگذاری مسئولیت است .برای درک بهتر لازم است مثالی در دنیای شی گرایی برای آن بزنیم
مثلا کلاس زیر را در نظر بگیرید
public class person { private int _age; private string _name; private Pet _obj; public person(int personAge, string personName, int PetAge, string PetName) { _obj = new Pet(PetAge, PetName); _age = personAge; _name = personName; } }
در این کلاس یک شخص در نظر گرفته شده است .این شخص حیوان یا حیوانات خانگی دارد
کلاس Pet به صورت زیر است
class Pet { private int _age; private string _name; public Pet(int age, string name) { _age = age; _name = name; } }
همان طور که در کلاس Person می بینید توسط property به نام _obj که از نوع کلاس Pet تعریف شده است یک نوع ارتباط با کلاس Pet تعریف شده است .همان طور که در سازنده این کلاس می بینید در حین ساخته شدن کلاس شخص یا person کلاس حیوان خانگی هم نمونه سازی می شود.اگر نمونه سازی کلاس Pet با مشکل روبرو شود ایجاد نمونه شخص هم به مشکل خواهد خورد .با از بین رفتن شی شخص شی Pet هم از بین می رود.این نوع ارتباطی که بین این دو کلاس وجود دارد از نوع composion است .بهتر است که کار نمونه سازی از کلاس Pet یا کلاس داخلی تر به صورت خارجی انجام گیرد.به این واگذاری مسئولیت IOC می گوییم.
IOC می گوید که کلاس والد (Person) نباید به طور مستقیم وابسته به کلاس های دیگر باشد.رابطه ای که بین کلاس ها وجود دارد باید توسط کلاس های Abstract و یا توسطInterface تعریف شود.
برای پیاده سازی IOC از تزریق وابستگی استفاده می شود.تزریق وابستگی روش های مختلفی دارد از جمله constructor injection ، setter injection و یا interface-based injection .
AutoFac یک کتابخانه در زمینه تزریق وابستگی هاست . ASP.NET 5یک سازو کار توکار برای پشتیبانی از DI و یا همان Dpendency Injectionدارد .ولی قصد داریم به جای این از Auto Fac استفاده کنیم .
ابتدا نیاز دارید که اسمبلی های Auto Fac را به پروژه خود رفرنس دهید.قصد دارم برای شروع استفاده از Auto Fac ابتدا یک اینترفیس را تعریف کرده و آن را پیاده سازی نمایم .
به اینترفیس زیر توجه کنید.
public interface IOutput { void Write(string content); }
پیاده سازی اینترفیس بالا به صورت زیر است .
public class ConsoleOutput : IOutput { public void Write(string content) { Console.WriteLine(content); } }
بعد از نیاز دارید که نوع های خود را با autofac و در فایل StartUp ثبت کنید.
public IServiceProvider ConfigureServices(IServiceCollection services) { services.AddMvc(); var builder = new ContainerBuilder(); builder.RegisterType<ConsoleOutput>() .As<IOutput>().InstancePerLifetimeScope(); builder.Populate(services); var container = builder.Build(); return container.Resolve<IServiceProvider>(); }
حال کافی است که در کنترلر خود و در قسمت سازنده آن از IOutput استفاده کنید.
private IOutput _outputImpl; public HomeController(IOutput outputImpl) { _outputImpl = outputImpl; }
- ASP.net
- 6k بازدید
- 5 تشکر