C# 如何为这个领域驱动的设计挑战建模?

C# 如何为这个领域驱动的设计挑战建模?,c#,domain-driven-design,ddd-service,C#,Domain Driven Design,Ddd Service,在这里学习DDD 有两种类型的用户成员和工作人员。成员可以拥有订阅列表,并且可以随时购买其他订阅。职员用户还可以向成员添加订阅。当职员用户向成员系统添加订阅时,应记住是谁添加了此订阅 成员和职员用户处于完全不同的有界上下文中。他们有不同的权利,可以参加不同的团体。因此,我创建了一个成员聚合根,其中包含单独的有界上下文“Member”中的订阅列表。然后我在seprate Bounded context Staff中创建了Staff聚合根 当成员想要购买额外订阅时,这很容易,MemberServic

在这里学习DDD

有两种类型的用户成员和工作人员。成员可以拥有订阅列表,并且可以随时购买其他订阅。职员用户还可以向成员添加订阅。当职员用户向成员系统添加订阅时,应记住是谁添加了此订阅


成员和职员用户处于完全不同的有界上下文中。他们有不同的权利,可以参加不同的团体。因此,我创建了一个成员聚合根,其中包含单独的有界上下文“Member”中的订阅列表。然后我在seprate Bounded context Staff中创建了Staff聚合根

当成员想要购买额外订阅时,这很容易,MemberService只是将新订阅附加到成员,因为订阅是成员聚合和成员绑定上下文的一部分

但是,当staff user想要向用户添加新订阅时,问题就出现了,因为不再是会员向自己购买订阅,而是由staff向会员分配订阅

我在这里看到了多种解决方案,但似乎没有一种是完全正确的

  • 将订阅实体添加到员工聚合。(尴尬,因为员工没有订阅)
  • 员工用户添加订阅时,引发一个事件,该事件通过成员聚合将成员订阅添加到成员上。(尴尬,因为添加订阅的不是成员)
  • 直接从员工服务部呼叫成员聚合(违反DDD原则)
  • 将订阅移动到自身的有界上下文中,并使其成为聚合根。(这是错误的,因为成员与其订阅关系密切)
  • 我错过了什么

    分问题:


    允许在多个有界上下文服务中使用相同的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