我有一个表单,它在组合框中显示三个项目。 大陆,国家和城市
如果我选择一个项目,例如如果我选择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传递对象。你能建议怎么做吗?
答案 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>();