C# 如何为这个领域驱动的设计挑战建模?
在这里学习DDD 有两种类型的用户成员和工作人员。成员可以拥有订阅列表,并且可以随时购买其他订阅。职员用户还可以向成员添加订阅。当职员用户向成员系统添加订阅时,应记住是谁添加了此订阅C# 如何为这个领域驱动的设计挑战建模?,c#,domain-driven-design,ddd-service,C#,Domain Driven Design,Ddd Service,在这里学习DDD 有两种类型的用户成员和工作人员。成员可以拥有订阅列表,并且可以随时购买其他订阅。职员用户还可以向成员添加订阅。当职员用户向成员系统添加订阅时,应记住是谁添加了此订阅 成员和职员用户处于完全不同的有界上下文中。他们有不同的权利,可以参加不同的团体。因此,我创建了一个成员聚合根,其中包含单独的有界上下文“Member”中的订阅列表。然后我在seprate Bounded context Staff中创建了Staff聚合根 当成员想要购买额外订阅时,这很容易,MemberServic
成员和职员用户处于完全不同的有界上下文中。他们有不同的权利,可以参加不同的团体。因此,我创建了一个成员聚合根,其中包含单独的有界上下文“Member”中的订阅列表。然后我在seprate Bounded context Staff中创建了Staff聚合根 当成员想要购买额外订阅时,这很容易,MemberService只是将新订阅附加到成员,因为订阅是成员聚合和成员绑定上下文的一部分 但是,当staff user想要向用户添加新订阅时,问题就出现了,因为不再是会员向自己购买订阅,而是由staff向会员分配订阅 我在这里看到了多种解决方案,但似乎没有一种是完全正确的
允许在多个有界上下文服务中使用相同的DTO吗?据我所知,您确实至少有两个有界上下文,但不是(仅?)您确定的有界上下文:
订阅有界上下文
和授权有界上下文
Subscriptions-bounded context
包含成员获取新订阅或取消现有订阅时使用的逻辑。规则如下:成员可以拥有他想要的任意多个订阅。其他人可以添加订阅
授权范围上下文
包含用户
可以向成员添加订阅的规则。如果用户是成员,则他只能向其成员帐户添加订阅。如果用户来自员工,则他可以向其他成员添加订阅,但不能向自己的成员添加订阅,除非他也是成员(第一条规则)
由于有两个有界上下文,您需要将它们集成在一起"这两种绑定上下文都有使用。您可以在应用程序服务中实现这一点,方法是首先从授权绑定上下文调用查询/域服务,以检查当前经过身份验证的用户是否可以向成员添加订阅。如果当前经身份验证的用户不能向成员添加订阅,则返回异常,否则加载成员订阅s
aggregate,调用addSubscription(subscriptionId、IDIFtheUserThatAddsSubscription、subscriptionType等)
然后将聚合持久保存在存储库中
请注意,应用程序服务没有实例化新的订阅
实体,这是成员订阅
聚合的工作,您必须保护它的封装。您甚至可以将订阅
实体类保持为私有(受保护、包或C#中的任何语言机制)。无论如何,对成员订阅的任何访问都必须从MemberSubscriptions
聚合根目录进行(如addSubscription
,removeSubscription
,hasSubscription
等)。据我所知,您确实至少有两个有界上下文,但没有(仅?)您标识的内容:Subscriptions-bounded-context
和Authorization-bounded-context
Subscriptions-bounded context
包含成员获取新订阅或取消现有订阅时使用的逻辑。规则如下:成员可以拥有他想要的任意多个订阅。其他人可以添加订阅
授权范围上下文
包含用户
可以向成员添加订阅的规则。如果用户是成员,则他只能向其成员帐户添加订阅。如果用户来自员工,则他可以向其他成员添加订阅,但不能向自己的成员添加订阅,除非他也是成员(第一条规则)
由于有两个有界上下文,您需要将它们集成在一起这两种绑定上下文都有使用。您可以在应用程序服务中实现这一点,方法是首先从授权绑定上下文调用查询/域服务,以检查当前经过身份验证的用户是否可以向成员添加订阅。如果当前经身份验证的用户不能向成员添加订阅,则返回异常,否则加载成员订阅s
aggregate,调用addSubscription(subscriptionId、IDIFtheUserThatAddsSubscription、subscriptionType等)
然后将聚合持久保存在存储库中
请注意,应用程序服务没有实例化新的订阅
实体,这是成员订阅
聚合的工作,您必须保护它的封装。您甚至可以将订阅
实体类保持为私有(受保护、包或C#中的任何语言机制)。无论如何,对成员订阅的任何访问都必须从MemberSubscriptions
aggregate root进行(如addSubscription