在UI按钮单击中,我必须在实例化BLL对象之前实例化DAL对象。这似乎很麻烦,在对象本身之前创建对象依赖项(代码比在BLL中实例化依赖项的代码多)。这只是使用依赖注入时必须支付的价格吗?
让我觉得实例化BLL所需的准备就在UI中。这是进行依赖注入的正确方法吗?有没有办法干净地分离UI和BLL准备逻辑?
class DAL{
//Data access layer
}
class BLL{
public BLL(DAL dal){
this.dal = dal;
}
private DAL dal;
}
buttonRun_Click(object sender, EventArgs e){
DAL dal = new DAL();
BLL bll = new BAL(dal);
bll.DoStuff();
}
答案 0 :(得分:1)
如果你需要动态创建这些BLL对象,我会使用工厂对象。 UI可以将工厂注入其中,或者如果您没有在那里使用注入,则可以在构造函数中实例化。
buttonRun_Click(object sender, EventArgs e){
BLL bll = balFactory.Create();
bll.DoStuff();
}
然后工厂对象负责实例化BLL的实例,并确切知道如何完成。
但是如果你不需要每次点击一个新的,为什么不只是将一个BLL实例注入UI本身?
答案 1 :(得分:1)
构造函数链接(穷人依赖注入)
public Bll() : this (new Dal()) { }
public Bll(IDal dal) // to provide other IDal implementations if needed
{
this.dal = dal;
}
工厂方法
private Bll() { }
public static Bll Create()
{
IBll bll = new Bll();
bll.Dal = new Dal();
return bll;
}
使用IoC工具进行依赖注入(在互联网上搜索,这方面的框架非常丰富,无论是使用基于配置的XML注入,还是使用语言布线...... - 寻找Castle Windsor,Spring.Net,Unity,StructureMap, Autofac,Ninject ......)。 建议使用一些更高级的设计模式/应用程序体系结构(例如,某些MVC变体,因此您不要在演示事件处理程序中实例化对象),尽管您已经开始通过分离DAL,BLL等开发一些好的代码。 。 阅读:GoF设计模式,以及应用程序体系结构的一般性