例如,如果您有一个名为Person(ID,Name等)的数据库表,那么数据访问层应该返回业务层的对象是什么类型的?我在想这样的事情:
//data access tier public class DataAccess{ public interface IPerson{ int ID{ get; set; } string Name{ get; set; } } internal class Person : IPerson{ private int id; private string name; public int ID{ get{return id; } set{ id=value; } } public int Name{ get{retutn name; } set{ name=value; } } public static IPerson GetPerson(int personId) { //get person record from db, populate Person object return person; } } //business tier public class Person : IPerson{ private int id; private string name; public int ID{ get{return id;} set{id=value;} } public string Name{ get{return name;} set{name=value;} } public void Populate(int personId){ IPerson temp = DataAccess.GetPerson(personId); this.ID = temp.ID; this.Name = temp.Name; } }
但这一切似乎有点麻烦?这个问题有更优雅的解决方案吗?我应该将DataRow从数据访问层返回到业务层吗?
您无需在数据访问层(DAL)中重复类定义.
您可以在单独的程序集中将业务实体创建为"哑"容器,例如,您的Person类可以是: -
public class Person { int ID { get; set: } string Name { get; set: } }
然后,您可以为DAL提供对业务实体层的引用.您的控制器对象,无论它们是在单独的业务逻辑层中,还是在您的UI层中,都可以调用DAL,DAL可以创建业务实体,从数据库填充它并将其返回给您的控制器.
Imar Spaanjaars的这篇文章对这种模式有一个很好的解释.
您的业务层肯定不想了解数据行 - 尝试在数据层中保留特定于数据的类.这样可以减少耦合并使您可以在以后更改持久层,而无需进行批量重新构建.
要解决您的具体问题,您可以:
在数据层中创建基本数据对象/实体,并将其移交给业务层以供使用.
或者,就像你正在做的那样,创建DTO(数据传输对象),它纯粹作为一种方法,将数据从数据层传输到更高层的业务对象的更丰富的实现.您可以将此作为富域模型中存储库模式的一部分.
您可能想要考虑的另一件事是层层次 - 这对您如何看待这些事情有所不同.层通常是物理的,换句话说,它们定义了流程之间的界限.图层通常是合乎逻辑的,它们将程序的功能分成松散耦合的单元.在这种情况下,您的目标是图层.