目前我的应用程序的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设计保持为单身吗?
答案 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。