تزریق وابستگی (Dependency injection) توسط AutoFac در ASP.Net

شنبه 23 آبان 1394

AutoFac یک کتابخانه در زمینه تزریق وابستگی هاست . ASP.NET 5یک سازو کار توکار برای پشتیبانی از DI و یا همان Dpendency Injectionدارد .ولی قصد داریم به جای این از Auto Fac استفاده کنیم .

تزریق وابستگی (Dependency injection) توسط AutoFac در ASP.Net

در این مقاله قصد داریم راجع به تزریق وابستگی 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;
}

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید