C# 不同的有界上下文(BC)可以在一个WPF应用程序中保留吗?

C# 不同的有界上下文(BC)可以在一个WPF应用程序中保留吗?,c#,wpf,mvvm,domain-driven-design,C#,Wpf,Mvvm,Domain Driven Design,我们正在建立一个系统来管理我们的电子产品制造实习生产 考虑到我们模型的复杂性,我们认为DDD非常适合我们的项目 该系统由一个基于web的分布式系统和一个使用MVVM作为表示模式的WPF编码的大型桌面应用程序组成 我刚刚读过沃恩·弗农(Vaughn Vernon)的《实现域驱动设计》(implementing domain driven design)一书,这本书非常好,我感到非常困惑,因为DDD似乎非常适合基于web的环境,但WPF桌面应用程序是这样吗 作为DDD的新手,我对在桌面应用程序中集成

我们正在建立一个系统来管理我们的电子产品制造实习生产

考虑到我们模型的复杂性,我们认为DDD非常适合我们的项目

该系统由一个基于web的分布式系统和一个使用MVVM作为表示模式的WPF编码的大型桌面应用程序组成

我刚刚读过沃恩·弗农(Vaughn Vernon)的《实现域驱动设计》(implementing domain driven design)一书,这本书非常好,我感到非常困惑,因为DDD似乎非常适合基于web的环境,但WPF桌面应用程序是这样吗

作为DDD的新手,我对在桌面应用程序中集成DDD感到非常困惑

考虑到DDD的许多来源,包括iDDD手册,有人指出BC应该与其他BC解耦。管理不同BC之间集成的模式通常是创建开放主机服务。OHS可以使用REST、消息传递或SOAP实现。我对具有多个web应用程序的分布式系统了解这一点

但是,如果我在一个桌面应用程序WPF中有不同的BC呢

该应用程序必须覆盖大量的上下文,如生产监控、生产质量,对我来说这听起来像是不同的BC

在同一个windows应用程序中有几个BC可以吗?或者1个BC应该是1个应用程序?对于分布式系统来说,这似乎是最常见的情况

在一个桌面应用程序中集成不同BC的好模式是什么

一个解决方案似乎是在我的应用程序中创建一个事件总线,BC可以通过在总线上发布/订阅事件来相互通信。此实现看起来像Prism的EventAgreegator或mvvm light的Messenger,但专用于该模型


Udi Dahan在域事件拯救中提出了类似的模式,但它似乎仅限于一个BC,因为您已经阅读了Vaughn Vernon的DDD书,所以要知道DDD是通过首先理解问题并在域模型中解决它来解决复杂性的。 使用哪种技术或工具无关紧要注意:建议使用面向对象的语言来推广应用程序。 几年前,我们在一个桌面应用程序中遇到了类似的问题,我们使用windows应用程序进行演示。WPF更灵活,因为它强大的绑定特性让您可以使用MVVM模式和依赖注入

在同一个windows应用程序中有几个BC可以吗? 正如我提到的,DDD的有界上下文可以在一个windows或web应用程序中呈现,因为它们有自己的服务和存储库实现。
不要假设DDD的有界上下文是单独的项目!BCs可以成功地用于其他项目的领域,而不是单独的项目

这是一个值得称赞的问题,但是这里有太多的问题,我不认为任何一个答案都能足够详细地涵盖所有问题——除了写一本书。如果你多读一些关于这个主题的书,自己回答问题会更好。然后返回一小部分问题。不同的有界上下文BC可以在一个WPF应用程序中保留吗?非常好,特别是子项2,它确实适用于所有UI,而不仅仅是WPF UI。我还没有看到一个令人信服的答案来避免到处重复API,我认为如果原作者再次提出这个问题是值得的。谢谢你的反馈。我将我的问题编辑为只关注BC集成问题。我认为最初的问题更多的是关于如何从UI集成/使用不同的BC。更具体地说:您如何设计对这些BC的UI访问?您是否在不同的BC上创建了一个额外的门面,这样您的UI就不会被不同的BC所影响?或者您是否直接调用BCs,例如,通过向公共事件总线发送特定于BC的命令?在第一种情况下,需要大量额外的复杂性/代码重复,这可能是过火了。在第二种情况下,UI知道不同的BC并与它们紧密耦合。最佳实践?您可以为每个有界上下文设计不同的UI,也可以为不同的有界上下文设计一个UI,这取决于您的应用程序。对于解决方案中的有界上下文,可以使用event but或CQRS模式。我建议您看看这个实践,感谢您对DVD租赁示例的提示。每个业务连续性使用一个用户界面,例如,客户的订阅业务连续性和员工的完整填写业务连续性/操作用户界面,这两个用户界面由不同的方使用-员工与客户。最初的问题是,如果一个UI跨越多个BC(例如,生产监控和生产质量),该怎么办。这是一个自然的需求,因为客户(包括我们自己的客户)自然只想使用一个应用程序,而不是仅仅因为在
架构师决定使用二十个BC。对于UI/BC通信,@Ehsan建议的CQR非常适合。UI使用命令ACT与模型通信,这看起来非常干净。这似乎也是六边形体系结构中作为适配器提出的解决方案。但我仍然在寻找一个很好的解决方案,用于在同一进程中BCs之间的通信。在分布式体系结构中,我知道队列和服务总线(如rabbitMq和nServicebus)的使用非常适合于松散耦合、持久的通信机制。问题是,我的WPF将被部署数百次,因此我们希望为许可和管理问题部署尽可能少的基础设施。我在应用程序中附带了一个事件总线,但我不确定将BCs解耦是正确的解决方案