回答
就个人而言,我不喜欢看到的控制器库,或在一般的表示层。但我已经看过很多次,在DDD的背景下没有任何问题。
我认为答案是,这取决于你的项目到底有多大。服务层更常见于更复杂的项目中。而简单的MVC网站,例如直接使用存储库。
或者,我可以直接使用存储库来获得一个域对象?
你绝对可以。这正是存储库的目标。我想知道你会用什么样的服务(除了在SOA或基于Web服务的体系结构的特定上下文中)。
我的(打算)的问题是,如果我可以绕过服务并直接从存储库获取域实体(例如在MVC控制器中) – jgauffin
嗯,我说得对,答案是肯定的:)看到某种被认为完美的东西很有趣正常和普通,如果你看看原来的DDD书籍和运动现在似乎吓唬人... – guillaume31
我不害怕。我只是想知道最佳做法是什么。这本书于九年前发布,从那时起可能会发生一两件事情。 – jgauffin
完成我的第一个项目使用DDD原则结构后:d,我发现它是有用的两个域名服务和可用于应用层消耗库。
关键要点:如果您使用该架构,应用层可能是您的WCF服务或Web服务中的代码。这一切都取决于你的实施。如果它适合您的实现,那么您的应用程序层可能与您的表示层相同,因此在您的控制器或Web窗体代码中有应用程序层代码。
存储库功能类似于内存中的集合。对于应用程序层,代码应该看起来像只使用任何旧集合。
域服务的功能更像是一个永远不会被更新,也许处理,但不会直接更新处理器或存取信息。对于应用程序层,代码应该看起来像只使用任何旧的Web服务。
话虽这么说,我会更多地解释了一些例子:
库
我的仓库其实从我创建了一个实现对象类型的泛型集合继承,封装数据库键和业务一起模型。使用这种方法,我可以在我的接口,如
BusinessObject this[int index];
定义的索引,我可以有一个getter,将返回基于底层集合的索引和二传手的业务对象,将查找数据的关键从底层收集并将该对象保存到数据库。这使得应用程序的代码非常简单,例如
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原则的理解,应用程序层应该能够从服务或存储库访问业务对象。它们之间的选择归结为域模型中最适合的选择。
- 1. Android,我应该使用服务还是直播Receiver?
- 2. 我可以缓存WaitForEndOfFrame,还是应该每次使用yield new?
- 3. 我可以使用RavenDB(NoSQL)还是应该使用MySQL(RDBMS)?
- 4. 我可以为每个补丁存储变量还是应该使用海龟?
- 5. 我应该直接操作DOM还是使用React state/props?
- 6. 储存库应该使用对象还是基元?
- 7. 我应该直接使用IIS虚拟服务器中继还是连接到SMTP服务器?
- 8. 我们还应该使用服务器端网格还是使用Javascript网格?
- 9. 我应该使用sp_executesql还是EXEC运行存储过程?
- 10. 我应该使用mysql还是ssdb来存储like/vote数据?
- 11. 我应该使用哪个商店:文档存储还是SQLite?
- 12. 我应该使用NSUserDefaults还是plist来存储数据?
- 13. 我应该使用Amazon S3还是SimpleDB存储小文档?
- 14. 我应该使用SqlBulkCopy还是存储过程导入数据
- 15. 我应该使用单连接还是使用QSqlDatabase多连接
- 16. Require.js:扩展模块时,我可以直接使用原型,还是我应该使用extend?
- 17. 我应该使用OData还是开发自己的WCF服务?
- 18. Websphere集群:我应该使用节点还是服务器?
- 19. 我应该只使用一项新服务()还是更多?
- 20. WEBrick:RequestURITooLarge:我应该更新还是使用不同的服务器?
- 21. 我应该在访问Web服务时使用SOAP还是REST?
- 22. 我应该使用asyncTask还是服务联系我的服务器
- 23. 我的程序应该是应用程序还是服务?
- 24. 我应该使用Guid和Guid.Empty还是可以为空的Guid?
- 25. 在Symfony2中,我应该使用实体还是自定义存储库
- 26. 我应该使用文件还是数据库表来存储参数?
- 27. 我应该使用public $ var还是应该使用__construct()?
- 28. 我应该使用位图还是可绘制来存储Android上的ImageCache?
- 29. 我应该使用PurePDF还是AlivePdf
- 30. 我应该使用ABPersonViewController还是ABUnknownPersonViewController
“我不喜欢在控制器中看到存储库”=>您能详细说明为什么以及在控制器和存储库之间添加什么中间层? – guillaume31
控制器往往会很快膨胀。其中一个原因是因为开发人员最终将控制器中的业务逻辑强加于人。业务逻辑应该只存在于领域层,然后在服务层 - 不在控制器中,而不在存储库中。通过在你的控制器中使用(应用)服务,你可以避免这种情况。因此,例如,您可以调用accountService.GetUserByEmail(email)或catalogueService.GetProductViewModel。您的控制器保持良好和精益,您的应用程序服务会协调与各种存储库进行交谈。 – autonomatt
仅仅因为您从存储库获取对象并不意味着您处理业务逻辑。这只是*从域图层中获取对象以在另一图层中使用。我看不到单行userRepository.GetUserByEmail(email)比accountService.GetUserByEmail(email)更多的控制器。 – guillaume31