1

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

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

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 设计保持为单例?

4

3 回答 3

3

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

public class BarcodeBLL
{
    private JDE8Dal _context;

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

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

于 2012-12-10T08:49:30.903 回答
0

1:通常你有一个基础设施层来进行组合。

2:绝对没有。这接近于“学习编程”。使用 IOC 容器。

于 2012-12-10T08:53:46.013 回答
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,而不是一个类。在您编写它时,您似乎想要一个定义了所有持久性逻辑的上帝对象。数据访问层中的类更加细粒度和专业化:例如存储库/DAO 管理一个特定域对象的持久性。

此外,“仅仅因为只有一个实例感觉不错”而求助于 Singleton通常不是一个好主意。尤其是不可变的单例。在您的示例中,任何人都可以更改Dal.Instance.conString,这可能会对单例的其他消费者产生巨大的影响。除了其他缺点。

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

public class BarcodeBLL
{
    //DAL INIT HERE?
}

不,这里没有 DAL 初始化 ;)

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

于 2012-12-11T13:15:40.483 回答