Questions tagged «domain-driven-design»

域驱动设计(DDD)是一种通过将实现与核心业务概念的不断发展的模型紧密地联系在一起来开发满足复杂需求的软件的方法。请注意,最好在softwareengineering.stackexchange.com上询问概念性DDD问题。


7
在哪里可以找到DDD的良好示例?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我正在学习域驱动设计,但是有一些实际问题使我感到困惑,我认为看到一些好的样本可能会解决这些问题。 有谁知道一些可以很好地完成基本DDD概念建模的良好工作代码示例? 特别感兴趣 说明性领域模型 储存库 域/应用程序服务的使用 价值对象 汇总根

2
什么是域驱动设计(DDD)?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 改善这个问题 我在文章中经常看到使用DDD(域驱动设计)的情况-我已经阅读了有关DDD的Wikipedia条目,但仍然无法弄清楚DDD是什么以及如何在创建网站时实现它?


8
什么是域驱动设计?
有人可以(简洁)解释什么是域驱动设计?我看到这个词很多,但真的不明白它是什么或看起来像什么。它与非域驱动设计有何不同? 另外,有人可以解释什么是域对象吗?域与普通对象有何不同?

12
DDD-实体不能直接访问存储库的规则
在领域驱动设计,似乎有很多的协议,任何单位不应该访问存储库直接。 这是来自Eric Evans的“ 域驱动设计”书,还是来自其他地方? 背后的原因哪里有很好的解释? 编辑:澄清:我不是在谈论将数据访问从业务逻辑分离到单独层的经典OO做法-我是在谈论在DDD中实体不应该与数据交谈的特定安排根本没有访问层(即,它们不应保存对存储库对象的引用) 更新:我给了BacceSR赏金,因为他的回答似乎最接近,但是我对此仍然很不了解。如果它是如此重要的原理,那么肯定在某处在线有关于它的好文章吗? 更新:2013年3月,对该问题的投票暗示对此有很多兴趣,尽管有很多答案,但我仍然认为,如果人们对此有想法,还有更多的余地。

9
服务应该总是返回DTO,还是可以返回域模型?
我正在(重新)设计大型应用程序,我们使用基于DDD的多层体系结构。 我们的MVC具有数据层(存储库的实现),域层(域模型和接口的定义-存储库,服务,工作单元),服务层(服务的实现)。到目前为止,我们在所有层上都使用域模型(主要是实体),并且仅将DTO用作视图模型(在控制器中,服务返回域模型,并且控制器创建视图模型,该模型传递给视图)。 我读了无数关于使用,不使用,映射和传递DTO的文章。我知道没有明确的答案,但是我不确定是否可以将域模型从服务返回到控制器。如果我返回域模型,它仍然永远不会传递给视图,因为控制器始终会创建特定于视图的视图模型-在这种情况下,它似乎合法。另一方面,当域模型离开业务层(服务层)时,感觉不对。有时服务需要返回域中未定义的数据对象,然后我们必须向未映射的域中添加新对象,或者创建POCO对象(这很丑陋,因为某些服务返回域模型,因此某些服务有效地返回DTO)。 问题是-如果我们严格使用视图模型,是否可以将域模型一直返回给控制器,还是应该始终使用DTO与服务层进行通信?如果是这样,可以根据需要的服务来调整域模型吗?(坦率地说,我不这么认为,因为服务应该使用哪个域。)如果我们严格遵守DTO,是否应该在服务层中定义它们?(我是这样认为的。)有时候,很明显我们应该使用DTO(例如,当服务执行大量业务逻辑并创建新对象时),有时很显然,我们应该仅使用域模型(例如,当Membership服务返回贫乏的User( s)-创建与域模型相同的DTO似乎没有多大意义)-但我更喜欢一致性和良好做法。 Article Domain与DTO与ViewModel-如何以及何时使用它们?(以及其他一些文章)与我的问题非常相似,但是并不能回答这个问题。第二条我应该实现与EF存储库模式的DTO?也很相似,但不涉及DDD。 免责声明:我不打算仅仅因为它存在并且很花哨就使用任何设计模式,另一方面,我也想使用好的设计模式和实践,因为它有助于整体上设计应用程序,有助于分离的担忧,至少在目前,甚至不需要使用特定的模式。 与往常一样,谢谢。

8
DTO = ViewModel?
我正在使用NHibernate持久化域对象。为简单起见,我将ASP.NET MVC项目用作表示层和服务层。 我想从控制器类中以XML返回我的域对象。在阅读了一些有关Stack Overflow的文章之后,我收集了DTO。但是,我也遇到过有关ViewModel的帖子。 我的问题:数据传输对象和ViewModel是同一件事吗?还是ViewModel是DTO的一种子模式?


4
如何在POST操作中将视图模型映射回域模型?
互联网上有关使用ViewModels和Automapper的每篇文章都提供了“ Controller-> View”方向映射的指南。您将域模型与所有选择列表一起放入一个专用的ViewModel中,并将其传递给视图。很好。 该视图具有一个表单,最终我们处于POST操作中。在这里,所有的Model Binders和另一个[显然]的View Model [显然]至少在命名约定的一部分方面与原始ViewModel有关,这显然是为了绑定和验证。 您如何将其映射到您的域模型? 让它成为一个插入动作,我们可以使用相同的Automapper。但是,如果这是更新操作,该怎么办?我们必须从存储库中检索域实体,根据ViewModel中的值更新其属性,然后将其保存到存储库中。 附录1(2010年2月9日):有时,仅分配Model的属性是不够的。应该根据视图模型的值对域模型采取一些措施。即,应在域模型上调用某些方法。可能应该在控制器和域之间存在一种应用程序服务层,以便处理视图模型... 如何组织此代码以及将其放置在何处以实现以下目标? 保持控制器薄 荣誉SoC实践 遵循领域驱动设计原则 干燥 未完待续 ...

14
为什么应将域实体与表示层隔离?
域驱动设计的一部分似乎没有很多细节,它是如何以及为什么应将域模型与界面隔离的。我试图说服我的同事,这是一个好习惯,但是我似乎并没有取得太大进展。 他们在表示层和界面层中随便使用领域实体。当我向他们争辩说他们应该使用显示模型或DTO来将Domain层与界面层隔离时,他们反驳说在这样做时他们看不到商业价值,因为现在您需要维护一个UI对象以及原始域对象。 所以我在寻找一些具体的理由来支持这一点。特别: 为什么我们不应该在表示层中使用域对象? (如果答案很明显,那就是“解耦”,那么请解释一下为什么在这种情况下如此重要) 我们是否应该使用其他对象或构造将我们的域对象与接口隔离?

5
减少存储库以汇总根
目前,我几乎为数据库中的每个表都拥有一个存储库,并希望通过减少DDD使其仅聚合根来进一步使自己与DDD保持一致。 假设我有下表User和Phone。每个用户可能有一个或多个电话。没有聚合根的概念,我可能会做这样的事情: //assuming I have the userId in session for example and I want to update a phone number List<Phone> phones = PhoneRepository.GetPhoneNumberByUserId(userId); phones[0].Number = “911”; PhoneRepository.Update(phones[0]); 集合根的概念比实际更容易在纸上理解。我将永远不会拥有不属于用户的电话号码,因此取消PhoneRepository并将电话相关的方法合并到UserRepository中是否有意义?假设答案是肯定的,我将重写先前的代码示例。 我可以在UserRepository上使用返回电话号码的方法吗?还是应该始终返回对用户的引用,然后遍历用户之间的关系以获取电话号码: List<Phone> phones = UserRepository.GetPhoneNumbers(userId); // Or User user = UserRepository.GetUserWithPhoneNumbers(userId); //this method will join to Phone 无论我以哪种方式获得电话,假设我修改了其中一部电话,如何进行更新?我有限的理解是,应该通过根目录更新根目录下的对象,这将使我朝下面的选择#1前进。尽管这可以很好地与Entity Framework一起很好地工作,但这似乎没有什么描述性,因为即使Entity Framework在图形中更改对象的选项卡上,阅读代码我也不知道我实际更新的内容。 UserRepository.Update(user); // …

5
域对象,POCO和实体之间有什么区别?
我对他们的印象基本相同。模型对象也一样吗? 现在,在我的体系结构中,我有: class Person { public string PersonId; public string Name; public string Email; public static bool IsValidName() { /* logic here */ } public static bool IsValidEmail() { /* logic here */ } } class PersonService { private PersonRepository pRepository; PersonService() { pRepository = new PersonRepository(); } public bool …

8
CQRS事件来源:验证用户名的唯一性
让我们以一个简单的“帐户注册”示例为例,流程如下: 用户访问网站 点击“注册”按钮并填写表格,点击“保存”按钮 MVC控制器:通过读取ReadModel验证用户名的唯一性 RegisterCommand:再次验证用户名唯一性(这是问题) 当然,我们可以通过读取MVC控制器中的ReadModel来验证UserName的唯一性,以提高性能和用户体验。但是,我们仍然需要再次在RegisterCommand中验证唯一性,并且显然,我们不应该在Commands中访问ReadModel。 如果我们不使用事件源,则可以查询域模型,所以没有问题。但是,如果使用事件源,则无法查询域模型,那么如何在RegisterCommand中验证用户名的唯一性? 注意: User类具有Id属性,而UserName不是User类的键属性。使用事件源时,我们只能通过Id获取域对象。 顺便说一句:在要求中,如果已使用输入的用户名,则网站应向访问者显示错误消息“对不起,用户名XXX不可用”。向访问者显示一条消息,例如:“我们正在创建您的帐户,请稍候,我们将稍后通过电子邮件将注册结果发送给您”,这是不可接受的。 有任何想法吗?非常感谢! [更新] 一个更复杂的示例: 需求: 下订单时,系统应检查客户的订购历史记录,如果他是有价值的客户(如果客户在去年每月至少下达10个订单,那么他是有价值的),我们将为您减价10%。 实现方式: 我们创建PlaceOrderCommand,在命令中,我们需要查询订购历史记录以查看客户端是否有价值。但是,我们该怎么做呢?我们不应该在命令中访问ReadModel!正如Mikael所说,我们可以在帐户注册示例中使用补偿命令,但是如果在此订购示例中也使用补偿命令,它将太复杂,并且代码可能很难维护。

5
对有限的上下文和子域感到困惑
我已经读过Eric Evan的书,现在正在读Vaughn Vernon的书。我在第二章中,他谈论子域和有限的上下文,现在被彻底弄糊涂了。 从我的提炼中,BC和SD之间应该存在1:1的关系。但是,我在其他地方读到,不一定是这种情况。 有人可以向我解释BC和SD之间的关系吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.