问题标签 [domain-driven-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
472 浏览

design-patterns - 领域驱动设计问题

我想为此寻求推荐的解决方案:我们有一份比赛清单。每场比赛都规定了参赛者必须支付的费用 我们有参赛者 我必须知道有参加比赛的参赛者是否支付了费用。我正在考虑 2 个解决方案,问题是它必须是领域驱动设计中最合适的解决方案。首先是在竞赛中创建字典而不是列表,字典的类型为 <Participator, bool>。第二个可能是创建一个不同的类,它有 2 个字段,一个参与者和 feePaid。在竞争中,我会有一个新类的对象列表。

谢谢

0 投票
4 回答
6024 浏览

domain-driven-design - 领域对象和服务

这个问题中,有人回答“你永远不要让域对象实现自己调用服务!”。这个声明是 DDD 的硬性规则还是取决于您自己的应用程序和架构?

人为的例子:

例如,假设我们UserImage的模型中有一个对象,该对象由用户从上传的图像中填充。然后假设我们可以将此图像提交给第 3 方服务,该服务可以识别指纹并Guid在找到匹配项时返回 a。

不让域对象自己调用服务可以避免或获得什么?

编辑:有没有讨论这个特定主题的好的在线文章?

0 投票
2 回答
1410 浏览

c# - 使用依赖注入的存储库和专用存储库的装饰器链接

现在,我正试图找出一种更聪明地做事的方法,在此过程中,我设法做的就是在一天内使用一整瓶 excedrin。

假设我有一个像这样的名为 IRepository 的接口。

并假设我有一个像

现在,一切都很好,我可以对存储库执行所有基本操作以支持所有 CRUD 功能,但我可能需要专门的操作,所以假设我有一个这样的界面:

和这样的实现:

好的,这就是基本设置,现在我还想做一件事。我想要透明地进行日志记录和事务以及类似的事情。所以我想做的是使用像 Castle Windsor 或 StructureMap 这样的依赖注入框架,这样当我请求 IRepository 时,我会用 LoggingRepository 和 TransactionRepository 包装它,这两个都实现了 IRepository。

所以,我想做的是这样的:

并让它返回一个包含在 Logging 和 Transaction 装饰器中的用户存储库,但我想不出一种可行的方法。我能想到让它工作的唯一方法是像这样实现 UserRepository:

这意味着我们将使用依赖注入来创建一个修饰的存储库并将其传递给 UserRepository 的构造函数,然后将其用作我们对其运行操作的存储库。这会起作用,但我仍然认为它不是理想的。

所以,我的问题是,我是对的,这是做到这一点的唯一方法,还是我没有正确理解这一点,或者只是错过了一些东西。另外,如果你以前遇到过这个问题,你是如何解决这个问题的?

0 投票
1 回答
1620 浏览

asp.net - ASP.NET MVC - 复杂对象和表单

所以假设我们有一个域对象,如下所示

在输入姓名、电话号码和地址之前,此人无效。你们如何使用 ASP.NET MVC 和表单来处理这个问题......

我在想你可以将 Person 序列化到 session 并有多个视图来编辑 Name、添加电话号码、添加地址 - 控制器操作将修改 session 中的人,最终 Save 操作将推送到数据库。

我真的不喜欢拥有多个视图和使用会话。另一种选择是拥有一个非常复杂的表单,该表单可以具有元素的“动态”部分,用于在发布到保存操作之前在浏览器中添加/删除电话号码、地址。

每个人都在用复杂的对象做什么并通过表单进行编辑?

谢谢!

0 投票
4 回答
596 浏览

domain-driven-design - 业务逻辑应该放在领域还是服务中?

假设您有一个域实体用户,并且您希望支持用户将商品添加到他们的购物车的能力。现在,我们要确保购物车中的商品是唯一的,因此我们在 User 类中创建以下函数:

这很好用。但是,如果我们现在还想在将商品添加到购物车时向用户发送电子邮件怎么办?我们可以将它添加到 AddItemToCart 中,但它需要将某种 IEmailer 依赖项注入到 User 类中。

另一种方法是创建一个服务来处理此事务(例如 ShoppingCartService),该服务将执行业务逻辑并发送电子邮件。然而,这导致了一个相当贫乏的领域(即 User 类只不过是 getter/setter)

0 投票
2 回答
1567 浏览

service - 此实体存储库服务示例是否适合领域驱动设计?

我想知道您是否发现以下模式在域驱动设计中有意义。

领域层由模型和存储库组成。应用层由处理来自用户界面或模型-视图-控制器模式中控制器的查询的服务组成。

结构细节:

特别是,将方法移动到 Phrase 实体类中是否有意义?那样的话,怎么称呼?

编辑:

上面的示例在 moffdub 的回答和 Adeel Ansari 的评论后进行了修改。更改突出显示

我想问一下添加的 IPhraseRepository.GetPhrase(phraseId) 以及如何包含它?

0 投票
3 回答
596 浏览

model-view-controller - 如何在 MVC 模式中表示域聚合?

我应该为聚合中的每个对象创建一个单独的类,还是这些对象应该是单个聚合类的嵌套类?

0 投票
4 回答
946 浏览

asp.net-mvc - Blog Architecture Design, using MVC and DDD

I'm designing a blog architecture on asp.net mvc. Lets say i only have 2 entities: post and comment. do i need a controller and a repository for each one? how goes the mechanism for displaying a post with it's comments? do the post controller looks in the posts repository for the post, then asks the comment controller to retrieve all the comments connected to this post, gets them from the comments controller and passes them to the view? or maybe i should write a service which is responsible for querying both repositories and returning the results to the posts controller, which passes them to the view?

0 投票
4 回答
10982 浏览

domain-driven-design - 存储库模式:如何延迟加载?或者,我应该拆分这个聚合吗?

我有一个具有编辑器和项目概念的域模型。

一个Editor拥有多个Projects,一个Project不仅有一个Editor owner,还有多个Editor members。因此,一个编辑器也有许多“加入”的项目。

我正在采用 DDD 方法对此进行建模并使用存储库模式进行持久化。但是,我对模式的理解还不够好,无法确定我应该如何做到这一点。

我正在假设 Editor 和 Project 可能在同一个聚合中,根是 Editor。因此,我可以获得一个编辑器,然后枚举其项目,并可以从那里枚举项目的成员编辑器。

但是,如果我只被允许从我的存储库中检索编辑器,这是否意味着当我获得拥有它们的编辑器时,我必须从存储库中加载所有项目?如果我想延迟加载成员编辑器,项目是否也需要对存储库的引用?

或者,如果我拆分聚合并拥有一个编辑器存储库和一个项目存储库,我应该如何处理两者之间的事务,例如将新项目添加到编辑器时?例如:

我是否误解了存储库模式的意图?

0 投票
4 回答
3939 浏览

design-patterns - 让域对象知道数据访问层是不正确的吗?

我目前正在重写一个应用程序以使用从域层完全抽象数据库的数据映射器。但是,我现在想知道处理域对象之间关系的更好方法是:

  1. 直接在域对象内从相关数据映射器调用必要的 find() 方法
  2. 将关系逻辑写入本机数据映射器(这是示例在 PoEAA 中倾向于执行的操作),然后在域对象中调用本机数据映射器函数。

在我看来,为了保留“胖模型,瘦控制器”的口头禅,域对象必须了解数据映射器(无论是它们自己的还是它们可以访问系统中的其他映射器) . 此外,选项 2 似乎不必要地使数据访问层复杂化,因为它跨多个数据映射器创建表访问逻辑,而不是将其限制在单个数据映射器中。

那么,让域对象知道相关的数据映射器并直接从域对象调用数据映射器函数是不正确的吗?

更新:这是我可以设想的处理域对象之间关系问题的仅有的两种解决方案。欢迎任何显示更好方法的示例。