使用Unity作为IoC的构造函数依赖注入

时间:2010-12-29 01:06:58

标签: c# wpf unity-container

我有一个表单,它在组合框中显示三个项目。 大陆,国家和城市

如果我选择一个项目,例如如果我选择Cities,然后点击“获取结果”按钮,我会通过业务和数据层向数据库发送一个select命令,然后检索一个类型为Cities的列表。

然后将List绑定到UI表单上的网格。

类:Continents,Countries和Cities使用属性字符串“Name”实现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,而不是在按钮点击事件中使用工厂(类型)模式,如果然后使用硬编码的类名,我想使用容器的配置创建相关的类实例。当IEntities实例传递给BL类的构造函数时,我想使用Unity传递对象。你能建议怎么做吗?

1 个答案:

答案 0 :(得分:1)

如果存在,此设计不适合合并IoC容器。

只要您的ComboBox仍然包含字符串,您就必须将其与switch语句中的硬编码值或if某处< / em>的

此外,BL类采用类型为IEntity的构造函数参数,但在运行时它可以是许多不同类型中的任何类型的对象。没有办法在启动时配置Unity来实例化BL而不告诉它使用什么作为该参数(并且真的没有任何东西可以获得)。

有趣的是,您似乎只是为了将string名称传递给CreateItemsFromDatabase方法而实例化这些Entity对象;你没有使用它的类型。您似乎可以完全跳过构造函数参数,只需将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>();