Внедрение зависимостей в конструктор с использованием Unity в качестве IoC - PullRequest
1 голос
/ 29 декабря 2010

У меня есть форма, которая показывает три элемента в поле со списком. Континенты, страны и города

Если я выберу предмет, например если я выбираю «Города», а затем нажимаю кнопку «Получить результаты», я отправляю команду выбора в базу данных через слой данных и бизнеса, который затем получает список городов типа.

Список затем привязывается к сетке в форме пользовательского интерфейса.

Классы: Континенты, Страны и Города реализуют интерфейс IEntities со строкой свойства "Имя".

Событие нажатия кнопки вызывает бизнес-уровень, используя:

click(object sender, EventArgs e)
{
    string selectedItem = comboBox.SelectedItem;
    IEntities entity = null;
    List<IEntities> list = null;

    if (selectedItem == "Cities")
    {
        entity  = new Cities("City");   
    }

    if (selectedItem == "Continents")
    {
        entity  = new Continents("Continents");   
    }

    if (selectedItem == "Countries")
    {
        entity  = new Countries("Countries");   
    }

    //Then I call a method in Business Layer to return list
    BL bl = new BL(entity);
    list = bl.GetItems();
    myDataGrid.DataContext = list;//to bind grid to the list
}

Бизнес-уровень выглядит следующим образом:

public class BL
{

    public IEntities _entity;

    //constructor sets the variable
    public BL(IEntity entity)
    {
        _entity = entity;
    }

    public IList<Entities> GetItems()
    {
        //call a method in data layer that communicates to the database
        DL dl = new DL();
        return dl.CreateItemsFromDatabase(_entity.Name);//name decides which method to call
    }
}

Я хочу использовать Unity в качестве IOC, поэтому вместо использования фабричного (своего рода) шаблона в событии нажатия кнопки с помощью if then elses и использования жестко закодированных имен классов, я хочу использовать конфигурацию контейнера, которая создает соответствующий экземпляр класса. И когда экземпляр IEntities передается в конструктор класса BL, я хочу передать объект с помощью Unity. Подскажите пожалуйста, как это сделать?

1 Ответ

1 голос
/ 29 декабря 2010

Так как он существует, он не очень подходит для включения контейнера IoC.

Пока ваш ComboBox все еще содержит строки, вам придется сравнивать его с жестко закодированными значениями вswitch оператор или набор if блоков где-то .

Кроме того, класс BL принимает параметр конструктора типа IEntity, но это может быть объект любогосреди многих различных типов во время выполнения.Невозможно настроить Unity при запуске для создания экземпляра BL, не указав при этом, что использовать в качестве этого параметра (и, на самом деле, нечего его получать).

Интересно, что, похоже, вы создаете экземплярэти объекты сущности с единственной целью передачи их string имени методу CreateItemsFromDatabase;Вы не используете его тип ни для чего.Кажется, что вы можете вообще пропустить параметр конструктора и просто передать выбранный string из ComboBox напрямую в метод GetItems и получить тот же результат.Если у вас есть какая-то другая причина для этого, по крайней мере, вы не должны указывать имя в конструкторе;сделайте его const в каждом объявлении класса.

Что может быть лучше, так это сделать GetItems универсальным методом.Вместо передачи IEntity в конструктор BL, вы передадите конкретный тип методу:

var bl = new BL();
 var countries = bl.GetItems<Countries>();
 var cities = bl.GetItems<Cities>();
 var continents = bl.GetItems<Continents>();
...