我试图将我的DAL与我的业务层分开,在这样做的时候,我决定避开任何ActiveRecord方法并采用DataMapper方法。 换句话说,我的域对象不会保持自己的持久性。在这样做的过程中,我似乎正在蚕食“贫血领域模式”的反模式。例如,我的程序中的一个实体是组织。
组织代表如下:
class Organization {
private $orgId;
private $orgName;
// getters and setters
}
所以基本上这个组织除了作为“包”(如马丁福勒所说)的一些数据之外什么都不做。在PHP世界中,它只不过是一个美化的数组。与之相关的行为为零。
在程序中的行为,我一直坚持像“组织服务”这样的“服务级别”类,它主要充当这些对象和DAL之间的中介。
除了PHP的潜在扩展问题(我还有其他原因,我坚持在这些对象中“装袋”我的数据),这种方法是完全关闭的吗?
在这些情况下,您如何处理域模型? 也许组织首先不属于我的域名?
答案 0 :(得分:6)
我现在想到的一个例子是,如果你有人(员工),你可能想要将他们与组织联系起来。所以,您可能有一个方法AssociateEmployee(User employee)
可能会在您的组织类中找到它的位置。
或者您可以更改公司的位置,而不是分三步设置地址,城市,州等参数,您可以添加ChangeLocation(Street, City, State)
方法..
只需逐步进行,当您在BL /服务层中遇到一些似乎应属于域的代码时,将其移至域中。如果您阅读Fowler,当您在代码中看到它时,您很快就会知道它。
答案 1 :(得分:2)
现在可能只是贫血?
例如,有一次我正在开发会议/会议注册网站。它始于一次会议。
还有一个会议班,只有一个例子,但是第二年我们举行了会议,它被扩大了,并且增加了新的房产(举行两次背靠背会议),显然它还没有完全我们随后增加了可以包含多个会议的会议组。
所以我认为重要的是要记住,域名会随着时间的推移而变化,而您的模型最终可能会被重构,所以即使您认为它很贫乏,也可能只是有点过于前瞻性(就像您的组织类一样)将开始获得一些设置,规则或偏好等。)
答案 2 :(得分:2)
您可能还会考虑,如果您没有很多业务规则,或者域名并不复杂,那么DDD对您来说可能是一个过多的开销。 DDD对于大型复杂域来说是一个很好的解决方案,但是如果你只是在数据中输出数据,那么它就会带来很多开销和复杂性。 DDD更难设计并且固有地增加了复杂性,因此为了证明它,问题域的复杂性应该超过它。
这就是我要添加到zappan和epitka的所有内容。
答案 3 :(得分:1)
您的实体并非贫血,因为您正在采取不应该在那里开始的可转让性。持久化和获取实体是存储库的可靠性。实际上,您的行为应该在您的实体中,而不是在服务层中。但解释什么在哪里超越简单的答案。 Eric Evans的DDD是一个很好的起点。