依赖注入和UI组织化

本文关键字:组织化 UI 注入 依赖 | 更新日期: 2023-09-27 17:58:49

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

依赖注入和UI组织化

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

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

然后,工厂对象负责实例化BLL的一个实例,并确切地知道如何做到这一点。

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

构造函数链接(较差的人工依赖注入)

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设计模式和应用程序架构的概述