依赖注入和UI组织

时间:2011-06-10 21:45:37

标签: c# dependency-injection

在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();
}

2 个答案:

答案 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设计模式,以及应用程序体系结构的一般性