PDA

View Full Version : تزریق وابستگی dependency injection



HOSSEINONLINE7
پنج شنبه 16 مرداد 1393, 02:58 صبح
سلام دوستان من مطالب موجود در این مورد را مطالعه کردم و متوجه کاربردش شدم و برای پیاده سازیش این مطلب را خوندم :

www.dotnettips.info/post/1006/تزریق-وابستگی-dependency-injection-و-توسعه-پذیری

ولی واقعیتش کامل متوجه نشدم .:متفکر:

لطفا با یک مثال ساده برای پیاده سازیش راهنماییم کنید .

تشکر

hakim22
پنج شنبه 16 مرداد 1393, 08:26 صبح
تزریق وابستگی بر اساس استفاده از اینترفیس است. شما برای هر کلاسی که میخواهید در این سیستم استفاده کنید ابتدا باید اینترفیس آن را تعریف کنید. بعد کلاس معادل آن را از Implement کردن اینترفیسش بسازید.

بعد در کنترلر ها و هرجایی که میخواهید از آن استفاده کنید با استفاده از Constructor Injection یا Property Injection کلاسهای مورد نظر را با استفاده از اینترفیس مربوطه معرفی می کنید.

مثل :


public class DocumentPrinter
{
private IDocumentRepository _repository;
private IDocumentFormatter _formatter;
private IPrinter _printer;
public DocumentPrinter(
IDocumentRepository repository,
IDocumentFormatter formatter,
IPrinter printer)
{
_repository = repository;
_formatter = formatter;
_printer = printer;
}
public void PrintDocument(string documentName)
{
var document = _repository.GetDocumentByName(documentName);
var formattedDocument = _formatter.Format(document);
_printer.Print(formattedDocument);
}
}


بعد از هر DIContainer که استفاده کنید مانند StructureMap یا Ninject یک بخشی دارد که شما تعیین می کنید کدام اینترفیس باید روی کدام کلاس قرار گیرد. کار این ابزار این است که در یک سطح بالاتر از از کلاسهای اصلی پروژه قرار می گیرند و هر وقت هر کلاسی نیاز به کلاس دیگر داشت کلاس مربوطه را از روی اینترفیسش پیدا می کنند و یک نمونه ی جدید از آن می سازند. و آن را به کلاس درخواست کننده تزریق می کنند.


ObjectFactory.Configure(cfg =>
{
cfg.For<IDocumentRepository>().Use<FilesystemDocumentRepository>();
cfg.For<IDocumentFormatter>().Use<DocumentFormatter>();
cfg.For<IPrinter>().Use<Printer>();
});

معمولا شما با پیروی از یک سری Convention ها نیازی نیست که تک تک اینترفیس ها را به کلاس مربوطه مپ کنید.

در واقع تزریق وابستگی ها بیشتر یک روش کد نویسی است که شما باید ابتدا اینترفیس ها را بسازید و در هرجا به کلاس مربوطه نیاز داشتید فقط باید از اینترفیسش را معرفی کنید.

مثلا درون کنترلها فقط باید اینترفیس کلاس را معرفی کنید و از روی اینترفیس کدها را می نویسید.

بعد هم باید StructureMap یا Ninject یا Unity را تنظیم کنید که کدام کلاس روی کدام اینترفیس باید مپ شود. در غیر این صورت پیچیدگی خاصی ندارد.