我应该总是使用服务,还是可以直接使用存储库?

时间:2012-01-20 15:22:14

标签: domain-driven-design

当我尝试关注DDD时,我是否应该经常使用这些服务?

或者我可以直接使用存储库来获取域对象吗?

3 个答案:

答案 0 :(得分:8)

就个人而言,我不喜欢在控制器或一般的表示层中查看存储库。但我已经多次看过它,并且DDD背景下没有任何问题。

我认为答案是,这取决于你的项目有多大。在更复杂的项目中更常见服务层。而更简单的MVC网站就是直接使用存储库。

答案 1 :(得分:2)

  

或者我可以直接使用存储库来获取域对象吗?

你绝对可以。这正是存储库的目标。我想知道你使用什么样的服务(除了在SOA或基于Web服务的架构的特定上下文中)。

答案 2 :(得分:0)

完成我使用DDD原则构建的第一个项目后:D,我发现让应用程序层可以使用的域服务和存储库都很有用。

关键点:如果您正在使用该架构,则应用层可能是您的WCF服务或Web服务中的代码。这一切都取决于您的实施。如果它适合您的实现,您的应用程序层可能与您的表示层相同,因此在您的控制器或Web表单代码中具有应用程序层代码。

存储库的功能类似于内存中的集合。对于应用程序层,代码看起来应该只是使用任何旧集合。

域服务功能更像是处理器或访问器,用于永远不会更新,可能处理但不直接更新的信息。对于应用程序层,代码看起来应该只是使用任何旧的Web服务。

话虽如此,我将通过一些例子来解释更多:

<强>存储库

我的存储库实际上是继承自我创建的实现对象的通用集合,该实现对象将数据库密钥和业务模型封装在一起。使用这种方法,我可以在我的界面中定义一个索引器,例如

BusinessObject this[int index];

我可以有一个getter,它将根据底层集合的索引返回业务对象,以及一个setter,它将从底层集合中查找数据键并将对象保存到数据库中。这使得应用程序代码非常简单,例如

IBusinessObjectRepository repository = new SqlBusinessObjectRepository(sqlString);
BusinessObject obj = repository[0]; //Get first object in the list.
//Make some changes to the business object by setting properties or calling methods to process business logic.
repository[0] = obj; //Save the object back to the database.

<强>服务

我使用服务来检索我不会单独编辑的实体和值对象的列表,在我的情况下,仅在聚合根上调用方法时用作可用的选择或值。通常,我将此信息缓存在Web服务器上。这不是域服务的唯一用途,只是我的例子。应用层代码仍然相对简单。

IBusinessService service = new ImplBusinessService(implementationArgs);
List<BusinessObject> objsToCache = service.GetBusinessObjects();
//cache the objects on the web server.

总之,根据我对DDD原则的理解,应用层应该能够从服务或存储库访问业务对象。它们之间的选择归结为域模型中最适合的。