试图实现3层(不是:层,我只是想在逻辑上将我的项目分开,在一台机器上)架构我发现了很多不同的方法,我很困惑,最好的方法是什么(如果有的话)在WinForms应用程序中.
@H_502_2@现在我毫不怀疑项目中应该存在的3个层次:
@H_502_2@> UI(表示层)
> BLL(业务逻辑层)
> DAL(数据访问层) @H_502_2@在UI中我放了所有的WinForms.必须还有一些逻辑用控件中的数据填充对象并将其传递给BLL层. @H_502_2@在DAL中,我想使用ADO.NET为数据操作添加类和方法,如:
另一方面,一些“聪明人”和他们的追随者(如here)称之为Anemic Domain Model,并抱怨这是一个不应该使用的糟糕的设计和反模式. @H_502_2@专业人士: @H_502_2@> DTO可以很容易地通过设计来表示数据库表,
>它清晰明了,只包含数据库所需的字段,
> DAL不必参考BLL, @H_502_2@缺点: @H_502_2@>反模式(听起来可怕; P),
>违反OOP(方法中的分离属性),
>因为逻辑处于不同的类别,当某些事情发生变化时可能更难以维护. @H_502_2@所以,相反的方法是在层之间传递整个对象,比如here:没有DTO,只是BLL看起来像那样:
>逻辑和属性都在一个地方,更易于维护和调试. @H_502_2@缺点: @H_502_2@>要使用该对象,DAL必须引用BLL(这不是3层图层应该如何做的,不是吗?).
> class可能包含一些未在Database中使用的字段,以及来自Database的某些字段(如Id)不代表“真实生活”对象. @H_502_2@所以,它看起来像我选择的任何东西,我会违反一些规则.那么什么是更好的方式,我应该选择哪个?也许还有其他方法我还没找到?
> BLL(业务逻辑层)
> DAL(数据访问层) @H_502_2@在UI中我放了所有的WinForms.必须还有一些逻辑用控件中的数据填充对象并将其传递给BLL层. @H_502_2@在DAL中,我想使用ADO.NET为数据操作添加类和方法,如:
public class OrderDAL { public OrderDAL() { } public int Add(Order order) { //...add order to database } public int Update(Order order) { //...update order in database } //...etc. }@H_502_2@问题在于BLL和问题 – 我应该使用数据传输对象在层之间传递数据,还是应该通过整个类? @H_502_2@如果我选择使用DTO,那么我将创建另外的公共类Order,它引用UI,BLL和DAL:
public class Order { public int Id { get; set; } public DateTime Date { get; set; } public string Number { get; set; } public string CustomerName { get; set; } public Order () { } }@H_502_2@并将逻辑分为BLL:
public class OrderBLL { public OrderBLL() { } public int Add(Order order) { OrderDAL orderDAL = new OrderDAL(); return orderDAL.Add(order); } public int Update(Order order) { OrderDAL orderDAL = new OrderDAL(); return orderDAL.Update(order); } //...etc. }@H_502_2@这种方法在不同名称下使用:here或here.
另一方面,一些“聪明人”和他们的追随者(如here)称之为Anemic Domain Model,并抱怨这是一个不应该使用的糟糕的设计和反模式. @H_502_2@专业人士: @H_502_2@> DTO可以很容易地通过设计来表示数据库表,
>它清晰明了,只包含数据库所需的字段,
> DAL不必参考BLL, @H_502_2@缺点: @H_502_2@>反模式(听起来可怕; P),
>违反OOP(方法中的分离属性),
>因为逻辑处于不同的类别,当某些事情发生变化时可能更难以维护. @H_502_2@所以,相反的方法是在层之间传递整个对象,比如here:没有DTO,只是BLL看起来像那样:
public class Order { public int Id { get; set; } public DateTime Date { get; set; } public string Number { get; set; } public string CustomerName { get; set; } public Order() { } public int Add() { OrderDAL orderDAL = new OrderDAL(); return orderDAL.Add(this); } public int Update(Order order) { OrderDAL orderDAL = new OrderDAL(); return orderDAL.Update(order); } }@H_502_2@专业人士: @H_502_2@>它是一个很好的封装对象,遵循OOP规则(我想;)).
>逻辑和属性都在一个地方,更易于维护和调试. @H_502_2@缺点: @H_502_2@>要使用该对象,DAL必须引用BLL(这不是3层图层应该如何做的,不是吗?).
> class可能包含一些未在Database中使用的字段,以及来自Database的某些字段(如Id)不代表“真实生活”对象. @H_502_2@所以,它看起来像我选择的任何东西,我会违反一些规则.那么什么是更好的方式,我应该选择哪个?也许还有其他方法我还没找到?