Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从用户界面移除数据访问层耦合_C#_.net_Domain Driven Design_Data Access Layer - Fatal编程技术网

C# 从用户界面移除数据访问层耦合

C# 从用户界面移除数据访问层耦合,c#,.net,domain-driven-design,data-access-layer,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; namespace YLA.Barcode { public static class YlaBarcodeUtil { public static string

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

//Initialize Data Access for AS400
Dal = JDE8Dal.Instance;
Dal.conString = Properties.Settings.Default.conAS400;
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?
}
}
达尔被设计成独生子女。我认为强制应用程序拥有一个实例是一个好主意

达尔:

我的BLL将如下所示:

//Initialize Data Access for AS400
Dal = JDE8Dal.Instance;
Dal.conString = Properties.Settings.Default.conAS400;
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设计保持为单例?

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

public class BarcodeBLL
{
    private JDE8Dal _context;

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

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

1:通常情况下,您有一个进行组合的基础结构层

2:当然不是。这接近于“学习编程”。使用IOC容器

//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对象。数据访问层中的类更加细粒度和专门化:例如,Repositories/DAO管理一个特定域对象的持久性

除此之外,通常会求助于单身人士,“仅仅因为只有一个实例感觉是对的”。尤其是不是一个可变的单身汉。在您的示例中,任何人都可以更改
Dal.Instance.conString
,这可能会给singleton的其他消费者带来巨大的后果。除其他缺点外

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

public class BarcodeBLL
{
    //DAL INIT HERE?
}
Non,这里没有DAL init;)


业务逻辑层(DDD中的域层)不应该引用DAL,DAL应该引用BLL。域对象不应该知道如何保持自身(持久性忽略原则),因为它将有太多的责任(单一责任原则),这将在BLL和DAL之间创建紧密耦合,这使得重用和维护BLL变得非常困难。

我建议您在尝试实现之前先开始阅读DDD。特别是,蓝皮书和DDD很快就有了关于分层体系结构的一章,这可能会有所帮助。调查存储库也可能是个好主意。@guillaume31我真的是被迫去ioc的吗?我的意思是,特定的dal不会改变,因为改变意味着新的ERP,而新的ERP意味着完全的重新设计。因此,我认为在我的情况下,IoC不是必须的。根据应用程序的大小和复杂性,如果您想正确测试代码,IoC/DI可以是必须的。看我的答案。当你说短命时,你到底是什么意思?。我的dal方法很晚才打开连接,每个方法都会尽快关闭连接。我还应该在每个bll方法操作中尽可能短的时间内处理dal对象。例如,完成逻辑操作。ORM正在缓存数据,如果长时间保持它们的活动状态,本地缓存将处于与数据库不同的状态,并且在提交更改时会出现冲突。我将在何处创建JDE8Dal上下文?把它传过来?我不能在我的UI中完成它。我应该在哪里做?在DAL班?怎么用?你能详细说明一下吗?IoC容器将为你创建它,并通过构造函数将它注入你的BarcodeBLL类中。我建议你阅读更多关于控制反转模式的内容(谷歌是你的朋友:))。您可以使用的容器之一是Ninject:我得到了关于单例和DI用途的要点。我真的不明白你最后的想法是DAL应该引用BLL,而不是相反。如果我想在BLL中有一个CheckLotValid逻辑,它需要2-3个dal方法来运行和返回数据,如果我不在BLL中创建我的dal对象,我该怎么做?DDD假定所有业务逻辑都在域层中。只有当您希望从数据库中水合对象或持久化对象时,才可以使用DAL,这通常是在应用程序层中或作为ORM工具工作的一部分来完成的。但是,如果域层确实需要访问DAL,比如说存储库,那么您可以始终将具体的存储库注入域对象,从而保持BLL和DAL之间的松散耦合。