2010-12-29 2 views
1

У меня есть форма, которая показывает три элемента в комбинированном поле. Континенты, страны и городаИнъекция зависимостей конструктора с использованием Unity as IoC

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

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

Классы: континенты, страны и города реализуют интерфейс 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 
} 

Business Layer выглядит следующим образом:

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, как МОК, так вместо того, чтобы использовать завод (вроде) шаблон в событии нажатия кнопки с if then elses и с использованием имен жестких классов, я хочу использовать конфигурацию контейнера, которая создает соответствующий экземпляр класса. И когда экземпляр IEntities передается конструктору класса BL, я хочу передать объект с помощью Unity. Можете ли вы посоветовать, как это сделать?

ответ

1

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

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

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

Интересно, что вы, кажется, создаете экземпляры объектов Entity с единственной целью передать свое имя 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>(); 
Смежные вопросы