使用内部方法将数据库记录加载到域对象

时间:2016-05-18 18:01:33

标签: c# oop

我的域层中有一个Form对象,它以分层方式包含多个记录(对应一个表行)。这些记录包含字段(该表的列)。允许应用程序用户更新字段并从表单中添加/删除记录。表单对象的这个公共API启动表单的验证规则。

但是如何将数据库值加载到表单对象中?由于数据访问层知道域层,我应该在域对象中创建内部方法吗?因此,当服务层(位于域顶部)向数据访问层询问表单对象时,数据访问层可以使用这些内部方法来创建所需的域对象。

public class DEForm
{
    public DEForm(FormNumber number){}

    public AddRecord(RecordNumber to, string type) { // do some validation here}

    internal AddExisting(Record record, RecordNumber to){}
}

抱歉,这可能是一个新手问题。我在设计应用程序方面没有太多经验。如果信息令人困惑,请告诉我,我会添加更多细节。

感谢。

2 个答案:

答案 0 :(得分:0)

有许多模式可以满足您的要求。我不打算在这里评论或列出它们,只是为了概述我通常使用的模式。

底层是数据的源存储库。它可以是数据库,Web服务,WCF服务,企业服务总线等等。在这里,您可以获得填充域对象所需的数据。

下一层次由数据访问层和域对象组成。在我的设计中,域对象是愚蠢的。它们只是数据容器。数据访问层由数据访问对象(DAO)组成。这些对象负责查询数据源并使用数据填充所需的域对象。每个域对象都有一个特定于它的DAO。

DAO各自提供方法Fetch,FetchList,Insert,InsertList,Update,UpdateList,Delete和DeleteList。在内部,Fetch方法使用一个名为Transform的私有方法,它将Record(当数据源是数据库时从DataReader)作为参数,并返回相应的域对象。

下一层是存储库层,该层负责使用DAO填充/持久化复合对象(包含数据和子对象的对象)。

下一层是业务层,其中包含应用业务规则的对象。

下一层是服务层。该层使数据可用于接口层。

接口层是演示文稿(用于基于UI的应用程序)或公开的接口(Web服务,WCF服务等)。

我绝不会声称这是“正确”或“最佳”模式,只是它是我使用的模式。

答案 1 :(得分:0)

为了保持封装,您的设计必须防止业务层中的对象在外部创建;也就是说,不应该从BL外部new DEForm。{这是为了保证只有BL强制执行对象的创建规则。如果您希望对象来自数据访问层的数据,请展示数据访问层(或桥接类)调用的工厂(例如DEFormFactory)。

或者,您可以使用ORM,例如Entity Framework。