#c# #dependency-injection
#c# #внедрение зависимостей
Вопрос:
При нажатии кнопки пользовательского интерфейса я должен создать экземпляр объекта DAL, прежде чем я смогу создать экземпляр объекта BLL. Это кажется громоздким, создавать зависимости объекта перед самим объектом (больше кода, чем если бы зависимость была создана внутри BLL). Это просто цена, которую вам приходится платить за использование внедрения зависимостей?
Меня просто беспокоит, что подготовка, необходимая для создания экземпляра BLL, находится в пользовательском интерфейсе. Это правильный способ внедрения зависимостей? Есть ли способ четко разделить логику подготовки пользовательского интерфейса и BLL?
class DAL{
//Data access layer
}
class BLL{
public BLL(DAL dal){
this.dal = dal;
}
private DAL dal;
}
buttonRun_Click(object sender, EventArgs e){
DAL dal = new DAL();
BLL bll = new BAL(dal);
bll.DoStuff();
}
Комментарии:
1. Это действительно DI? И dal, и bll являются локальными для обработчика событий, поэтому, если у них нет других зависимостей, то doStuff() не имеет заметного эффекта.
Ответ №1:
Если вам нужно создать эти объекты BLL «на лету», я бы использовал объект factory. В пользовательский интерфейс может быть внедрена фабрика, или, если вы не используете там инъекцию, она может быть создана в конструкторе.
buttonRun_Click(object sender, EventArgs e){
BLL bll = balFactory.Create();
bll.DoStuff();
}
Затем объект factory отвечает за создание экземпляра BLL и точно знает, как это делается.
Но если вам НЕ нужна новая при каждом нажатии, почему бы просто не внедрить экземпляр BLL в сам пользовательский интерфейс?
Ответ №2:
Цепочка конструкторов (внедрение зависимостей для бедных людей)
public Bll() : this (new Dal()) { }
public Bll(IDal dal) // to provide other IDal implementations if needed
{
this.dal = dal;
}
Заводские методы
private Bll() { }
public static Bll Create()
{
IBll bll = new Bll();
bll.Dal = new Dal();
return bll;
}
Внедрение зависимостей с использованием инструментов IoC (поищите это в Интернете, фреймворков для этого предостаточно, либо с использованием XML-инъекций на основе конфигурации, либо внутриязыковых подключений … — ищите Castle Windsor, Spring.Net, Unity, StructureMap, Autofac, Ninject …).
Рекомендуется использовать некоторые более продвинутые шаблоны проектирования / архитектуры приложений (например, некоторые вариации MVC, чтобы вы не создавали экземпляры своих объектов в обработчиках событий презентации), Хотя вы уже начинаете разрабатывать хороший код, разделяя DAL, BLL и т.д…
Прочитайте: Шаблоны проектирования GoF и общие сведения об архитектурах приложений