C# “限定上下文”;“一体化”;

C# “限定上下文”;“一体化”;,c#,asp.net-mvc,domain-driven-design,bounded-contexts,C#,Asp.net Mvc,Domain Driven Design,Bounded Contexts,我们试图找出一个场景的分离有界上下文集成 假设一个上下文是文档核心限定上下文(BC),并且有一个文档实体和作者。在中使用IdentityAccessContextBC,将用户、组和角色分离到各自的上下文中是有意义的 出现的问题是在考虑获取一个包含100多个文档的列表时 假设文档核心BC有自己的实体来标记文档的作者 public class Author { long Id; // Same as UserId long Document; } 然后身份BC有一个具有相关信息

我们试图找出一个场景的分离有界上下文集成

假设一个上下文是文档核心限定上下文(BC),并且有一个文档实体和作者。在中使用IdentityAccessContextBC,将用户、组和角色分离到各自的上下文中是有意义的

出现的问题是在考虑获取一个包含100多个文档的列表时

假设文档核心BC有自己的实体来标记文档的作者

public class Author
{
    long Id; // Same as UserId
    long Document;  
}
然后身份BC有一个具有相关信息的用户

public class User
{
    long Id;
    string FullName;
}
获取文档列表时,如何将IdentityAccessBC中的信息检索到文档作者中或与文档作者一起显示(例如全名)

似乎有两种选择:

  • 可能是一个反腐败层,它从两个表中获取数据
  • 将用户的全名复制到两个BC
  • 两者都感觉不太对,因为#1需要连接来自2个BC的数据(在某种程度上),而#2在更改用户名时可能需要更新几个BC

    对此我们能做些什么?(使用C#、MVC、NHibernate,如果需要) 显然,获取对象列表以及稍后获取(例如作者姓名和其他数据)是不现实的


    但是,在查看BC集成时,考虑到本书中提到的3个选项RPC、域事件和RESTful服务集成,在应用程序为MVC的情况下,至少后2个选项没有意义,它直接使用2个BC作为类库,并且它们都使用相同的数据库。可以通过IdentityBC的应用程序服务直接从MVC更新用户信息。数据库和BC可以根据需要进行更改。

    您可能不需要集成这些有界上下文,而需要组合它们。请参阅《实施DDD手册》中“应用”一章下的相关章节

    一种方法是创建一个应用程序服务,该服务访问两个有界上下文,并创建一个文档DTO,其中包含来自两个BC的信息


    您甚至可以更进一步,为其创建第三个有界上下文,并使用众所周知的BC集成技术来保持新BC的同步(消息传递、夜间批处理等)。正如沃恩·弗农(Vaughn Vernon)在他的书中指出的那样,这可能会导致新不列颠哥伦比亚省的贫血领域模型。

    您可能会感兴趣的一些解决方案:

    A.在文档绑定上下文中使用冗余属性。像

    public class Author {
        long Id; // Same as UserId
        string fullname://redundant
        long Document;  
    }
    
    但是这种方法并不灵活,如果查询需求发生变化,模型就必须改变

    域模型不擅长查询,如果您熟悉CQRS,更好的解决方案是构建一个单独的查询组件