2011-06-10 51 views
1

在UI按钮单击中,我必须先实例化一个DAL对象,然后才能实例化一个BLL对象。这看起来很麻烦,在对象本身之前创建对象依赖关系(比在BLL内实例化依赖关系更多的代码)。这仅仅是使用依赖注入必须支付的代价吗?依赖注入和UI组合

它只是让我感到需要实例化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

这不是一个问题.... – BentOnCoding 2011-06-10 21:47:58

+0

@Robotsushi,固定 – sooprise 2011-06-10 21:49:20

+1

这真的是DI吗?对于事件处理程序,dal和bll都是本地的,所以如果它们没有任何其他依赖关系,那么DoStuff()就没有可观察到的效果。 – Andrei 2011-06-10 21:53:50

回答

1

如果您需要创建这些BLL对象,我会使用工厂对象。 UI可以让工厂注入它,或者如果你没有使用注入,它可以在构造函数中实例化。

buttonRun_Click(object sender, EventArgs e){ 
    BLL bll = balFactory.Create(); 
    bll.DoStuff(); 
} 

工厂对象然后负责实例化一个BLL实例,并且确切知道如何完成。

但是,如果每次点击都不需要新建一个,为什么不直接将BLL实例注入到UI本身?

1

构造函数链(穷人的依赖注入)

public Bll() : this (new Dal()) { } 

public Bll(IDal dal) // to provide other IDal implementations if needed 
{ 
    this.dal = dal; 
} 

厂metods

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设计模式,并在应用程序体系结构上的一般