【发布时间】:2011-11-13 23:38:04
【问题描述】:
对不起,我的英语很差。
好的,我现在正在考虑 DDD 方法,这听起来不错,但是... 关于它有一个小问题。 DDD 表示域模型层与数据访问层(以及所有其他层)完全解耦。因此,当 DAL 将保存一些业务对象时,它将只能访问该对象的公共属性。现在的问题:
我们如何(通常)保证一个对象的一组公共数据 我们只需要稍后恢复对象吗?
示例
我们有以下业务规则:
- 必须在创建时为业务对象提供用户和域。
- 创建对象后无法更改用户和域。
- 业务对象具有类似于“user@domain”的电子邮件属性。
这是一个描述这些规则的纯 POCO:
public class BusinessObject
{
private string _user;
private string _domain;
public BusinessObject(string user, string domain)
{
_user = user;
_domain = domain;
}
public string Email
{
get { return _user + "@" + _domain; }
}
}
所以在某个时刻,DAL 会将此对象保存到外部存储(即 SQL 数据库)。显然,DAL 会将“Email”属性保存到 DB 中的相关字段中。在我们要求 DAL 恢复对象之前,一切都会正常工作。 DAL 如何做到这一点?该对象必须至少具有“电子邮件”字段的公共设置器。类似的东西
public string Email
{
set
{
string[] s = value.Split("@");
_user = s[0];
_domain = s[1];
}
}
实际上,该对象将为“用户”和“域”字段以及 GetEmail() 方法提供公共 getter/setter。但是停下来。我不希望我的 POCO 有这样的功能!它没有商业规则。必须这样做才能仅保存/恢复对象。
我看到了另一种选择。可以要求作为 DAL 一部分的 ORM 存储恢复对象所需的所有私有字段。但是,如果我们想让域模型与 DAL 分离,这是不可能的。 DAL 不能依赖业务对象的某些私有成员。
我能看到的唯一解决方法是拥有一些系统级工具,它可以为我们创建对象的转储,并可以随时从该转储中恢复对象。除了对象的公共属性外,DAL 还必须将此转储存储到存储中。因此,当 DAL 需要从存储中恢复对象时,它将为此使用转储。当 DAL 执行不需要实例化对象的操作(即大多数 link2sql 查询)时,可以使用保存到存储中的公共属性。
我做错了吗?我需要阅读更多内容吗?关于一些模式,也许是 ORM?
【问题讨论】:
标签: orm domain-driven-design poco data-access-layer