从用户界面删除数据访问层耦合

时间:2012-12-10 07:27:17

标签: c# .net domain-driven-design data-access-layer

目前我的应用程序的UI层已耦合到我的DAL dll。 Dal初始化如下:

//Initialize Data Access for AS400
Dal = JDE8Dal.Instance;
Dal.conString = Properties.Settings.Default.conAS400;

DAL被设为单身人士。我认为强制应用程序有一个实例是个好主意。

DAL:

public class JDE8Dal
    {
        public string conString { get; set; }
        private static readonly JDE8Dal _instance = new JDE8Dal();
        private JDE8Dal()
        {
        }
        public static JDE8Dal Instance
        {
            get { return _instance; }
        }
        // Methods
    }

我的BLL看起来像这样:

namespace YLA.Barcode
{
    public static class YlaBarcodeUtil
    {
        public static string LotStripZeroes(string str)
        {
            var ret = str;
            if (str.Trim().StartsWith("00"))
            {
                ret = YlaGeneralUtilities.StripLeadingNumofChars(str, 2);
            }
            return ret;
        }
    }

public class BarcodeBLL
{
    //DAL INIT HERE?
}
}

现在我需要构建更多应用程序,我需要进入3层架构并开始阅读DDD。

1)如何在BLL中移动DAL处理?只需在我的BLL部分添加初始化?

2)我应该将DAL设计保持为单身吗?

3 个答案:

答案 0 :(得分:3)

您应该使用“控制反转”模式来减少图层之间的依赖关系。在您的情况下,我将使用构造函数注入,因为您的类需要数据上下文:

public class BarcodeBLL
{
    private JDE8Dal _context;

    public BarcodeBLL(JDE8Dal context)
    {
        _context = context;
    }
}

数据上下文应该是短期对象。如果您正在开发Web应用程序,则应该为每个请求实例化一个数据上下文。我还建议使用ORM(实体框架/ NHibernate)。

答案 1 :(得分:0)

1:通常你有一个构成组合的基础设施层。

2:不是所有的意思。这与“学习编程”接壤。使用IOC容器。

答案 2 :(得分:0)

//Initialize Data Access for AS400
Dal = JDE8Dal.Instance;
Dal.conString = Properties.Settings.Default.conAS400;

该评论具有误导性。此代码实际上不初始化数据访问,但仅设置数据库连接字符串。这应该在DAL本身而不是在UI中完成。

public class JDE8Dal
    {
        public string conString { get; set; }
        private static readonly JDE8Dal _instance = new JDE8Dal();
        private JDE8Dal()
        {
        }
        public static JDE8Dal Instance
        {
            get { return _instance; }
        }
        // Methods
    }

图层通常不是这样定义的,DAL是一个程序集/ dll,而不是一个类。当你写它时,你似乎想要一个God Object,其中定义了所有持久性逻辑。数据访问层中的类更细粒度和专业化:例如Repositories / DAO管理一个特定域对象的持久性。

此外,通常not a good idea求助于Singleton“只是因为只有一个实例感觉正确”。尤其不是一个可变的单身人士。在您的示例中,任何人都可以更改Dal.Instance.conString,这可能会对单身人士的其他消费者造成严重后果。还有其他一些缺点。

即使可能有一个DAL(AS400似乎)的实现,在使用依赖注入进行单元测试的合理复杂项目中也是一个好主意。 DI使您可以轻松地将具体的DAL对象实现替换为更轻量级且在单元测试中更有用的伪DAL对象。

public class BarcodeBLL
{
    //DAL INIT HERE?
}

非,此处没有DAL初始化;)

业务逻辑层(DDD中的域层)不应该具有对DAL的引用,DAL应该具有对BLL的引用。域对象不应该知道如何持久化(持久性无知原则),因为它将承担太多责任(单一责任原则)并且会在BLL和DAL之间创建紧密耦合,使得重用和维护非常难以处理BLL。