【发布时间】:2010-12-07 17:35:43
【问题描述】:
Aggregate 根实体是否有可能拥有调用 Repository 的方法?
我知道不应该,但想得到确认,因为 Eric 的书也没有说清楚:(
我在哪里可以获得域驱动设计的单元测试示例?
【问题讨论】:
-
我不是说密密麻麻之类的,但我们应该知道 Eric 是谁吗?
-
是的,DDD + Eric = Eric Evans,每个人都知道。
Aggregate 根实体是否有可能拥有调用 Repository 的方法?
我知道不应该,但想得到确认,因为 Eric 的书也没有说清楚:(
我在哪里可以获得域驱动设计的单元测试示例?
【问题讨论】:
可以吗? -是的。
应该吗? -没有。
然而,所有答案都是上下文相关的,您不提供自己的答案。
一般建议是寻找“服务”或“规范”类型。
【讨论】:
这是一个宗教问题。 有些人认为这样做没有问题,而另一些人可能认为这样做是异端。
虽然我通常总是让我的存储库远离我的域模型(并且有一个上游服务对象处理存储库),但我有一个项目“要求”具有可从域模型访问的存储库。 这是由于域对象需要根据业务逻辑检索特定数据 => 使用规范对象/Linq to nHibernate(如何过滤属于该域对象的数据的责任和知识)和/或性能原因。
关于这样做的一个警告是如何获取对域对象的存储库的引用 - 在这种情况下,我使用了带有 IOC 工具的构造函数注入。
您是否应该这样做实际上取决于您使用的解决方案/用例/技术等...
【讨论】:
行为是-什么-它-是。 Eric 从名为“QueryService”的经纪账户实体调用类似存储库的实用程序。他提到这对于一个真正的项目来说不是一个好的设计。那你怎么办?
public class Clerk
{
public Clerk()
{
}
//Store Report in Database
public void File(Report);
{
ReportRepository.Add(Report);
}
}
您可以这样做,但最好告诉 Clerk 使用哪个存储库。
public class Clerk
{
private IReportRepository _reportRepository;
public Clerk(IReportRepository ReportRepository)
{
this._reportRepository = ReportRepository
}
//Store Report in Database
public void File(Report);
{
this._reportRepository.Add(Report);
}
}
【讨论】: