【问题标题】:Dependency Injection And UI Orginization依赖注入和 UI 组织
【发布时间】:2011-06-11 07:15:07
【问题描述】:

在 UI 按钮单击中,我必须先实例化一个 DAL 对象,然后才能实例化一个 BLL 对象。这似乎很麻烦,在对象本身之前创建对象依赖项(比在 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();
}

【问题讨论】:

  • 这真的是 DI 吗? dal 和 bll 都是事件处理程序的本地对象,因此,如果它们没有任何其他依赖项,则 DoStuff() 没有可观察到的效果。

标签: c# dependency-injection


【解决方案1】:

如果您需要即时创建这些 BLL 对象,我会使用工厂对象。 UI 可以将工厂注入其中,或者如果您没有在其中使用注入,则可以在构造函数中对其进行实例化。

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

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

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

【讨论】:

    【解决方案2】:

    构造函数链接(可怜的依赖注入)

    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 设计模式和应用程序架构的一般知识

    【讨论】:

      猜你喜欢
      • 2022-07-15
      • 2011-12-26
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 2017-04-02
      • 2012-02-15
      相关资源
      最近更新 更多