当我尝试关注DDD时,我是否应该经常使用这些服务?
或者我可以直接使用存储库来获取域对象吗?
答案 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原则的理解,应用层应该能够从服务或存储库访问业务对象。它们之间的选择归结为域模型中最适合的。