Внедрение зависимостей и UI Orginization - PullRequest
1 голос
/ 11 июня 2011

При нажатии кнопки пользовательского интерфейса я должен создать экземпляр объекта 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();
}

Ответы [ 2 ]

1 голос
/ 11 июня 2011

Цепочка конструктора (внедрение зависимых от бедного человека)

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 и общие сведения об архитектурах приложений

1 голос
/ 11 июня 2011

Если вам нужно создавать эти объекты BLL на лету, я бы использовал фабричный объект. В пользовательский интерфейс может быть встроена фабрика, или, если вы не используете там инъекцию, его можно создать в конструкторе.

buttonRun_Click(object sender, EventArgs e){
  BLL bll = balFactory.Create();
  bll.DoStuff();
}

Затем фабричный объект отвечает за создание экземпляра BLL и точно знает, как это делается.

Но если вам не нужен новый с каждым кликом, почему бы просто не внедрить экземпляр BLL в сам интерфейс?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...