![]() |
1
7
对问问自己,为什么域对象会知道这样的事情?甚至不是为什么,而是如何?您要将DAL注入域对象吗? 域应该遵循SRP,只需生活在其他方面。当您遍历您的域时,您应该不知道这些属性是通过延迟加载填充的,还是通过实例化生成的。 我已经编写了一个域模型,其中包含DAL对象,维护起来真是一场噩梦。然后我了解了NHibernate和我的域由POCO和它们各自的业务逻辑组成,我想封装它们。 [编辑] Domain Model management . 您感兴趣的是拦截器和mixin的实现。 使用这些工具,您可以编写employee类,如下所示:
正如您所看到的,我的数据访问需求不会对我的域设计产生任何影响。 |
![]() |
2
7
恐怕您对存储库模式的意图有点误解。 存储库的行为类似于特定域对象的内存集合,通常是聚合根:
这段代码的客户机不知道集合是否在内存中,就像单元测试一样,或者在某些情况下与ORM映射器交谈,或者在其他情况下调用存储过程,或者为某些域对象维护缓存。
针对对该答案的一些评论:
假设一个员工有很多技能。我认为员工存储库这样调用技能存储库没有什么错:
另一种方法不是调用技能库,而是让员工库调用存储过程(在本例中)来加载技能的结果集,然后委托给技能工厂以获取技能列表。
完全正确。我通常用这种方式模拟单元测试中的整个数据层。 |
![]() |
3
0
在进一步阅读并寻找合适的模式后,我偶然发现 the Repository Pattern . 据我所见,这正是预想中的解决方案,它允许像Person这样的域对象将查询正确地委托给适当的数据映射器,同时使域对象和数据映射器完全抽象。 |
![]() |
4
0
我不同意,我认为域对象可以通过抽象工厂访问存储库。
通过使用此模式,无需在代码中注入存储库接口 但只有存储库工厂。
我已经做了很多年了,在我的单元测试中没有任何问题。 因此,依赖项注入仅在此类RepositoryFactory中是必需的。 |