2010-12-29 3 views
1

콤보 상자에 3 개의 항목을 표시하는 폼이 있습니다. 대륙, 국가 및 도시Unity를 IoC로 사용하는 생성자 종속성 삽입

예를 들면 다음과 같습니다. 도시를 선택한 다음 "결과 가져 오기"버튼을 클릭하면 비즈니스 및 데이터 계층을 통해 데이터베이스에 선택 명령을 보내고 다음 유형의 도시 목록을 검색합니다.

목록은 UI 양식의 눈금에 바인딩됩니다.

클래스 : 대륙, 국가 및 도시는 속성 문자열 "이름"을 사용하여 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 
    } 
} 

내가 공장을 사용하므로 대신 IOC으로 유니티를 사용하려면 (일종의) 버튼 클릭 이벤트에서 패턴을 선택하고 하드 코드 된 클래스 이름을 사용하면 관련 클래스 인스턴스를 만드는 컨테이너의 구성을 사용하고자합니다. IEntities 인스턴스가 BL 클래스의 생성자에 전달되면 Unity를 사용하여 객체를 전달하려고합니다. 어떻게 할 수 있는지 조언 해 주시겠습니까?

답변

1

이 디자인은 존재하기 때문에 IoC 컨테이너를 통합하는 데 적합하지 않습니다.

는만큼 당신의 ComboBox 여전히 포함 문자열로, 당신은 비교해야 할거야 그 하드 switch 문에서 값이나에 대한 if 블록 곳 설정합니다.

또한 BL 클래스는 IEntity 유형의 생성자 매개 변수를 사용하지만 런타임에 다양한 유형의 객체가 될 수 있습니다. BL을 인스턴스화하기 위해 시작시 Unity를 구성 할 방법이 없으며 그 매개 변수로 무엇을 사용해야하는지 (실제로는 아무것도 얻지 못함)도 알려주지 않습니다.

흥미롭게도, string 이름을 CreateItemsFromDatabase 메서드로 전달하는 유일한 목적으로 이러한 Entity 개체를 인스턴스화하는 것 같습니다. 당신은 그 타입을 아무 것도 사용하지 않고 있습니다. 생성자 매개 변수를 모두 건너 뛸 수 있고 ComboBoxstringGetItems 메서드로 직접 전달하고 동일한 결과를 얻는 것처럼 보입니다. 이 작업을 수행 할 다른 이유가 있다면 최소한 생성자에 이름을 제공하지 않아야합니다. 각 클래스 선언 내에서 const으로 만드십시오.

더 적합한 방법은 GetItems을 일반적인 방법으로 만드는 것입니다. IEntityBL 생성자에 전달하는 대신 구체적인 유형을 메서드에 전달합니다.

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