1

在我的公司(第一次),我们正在使用 WPF 用 C# 开发一个相当大的业务应用程序。我决定采用类似于 Microsoft PRISM 中的 UI 模块化方法,但我对如何开发业务和数据层摸不着头脑。

我需要至少支持两个数据库:用于客户端/服务器安装的 SQL Server 和用于单用户安装的 SQLite,但我希望为其他数据库或云/rest 持久性解决方案做好准备。未来我们可能不得不开发一个网页版和一个 UniversalApp 版!

我正在考虑的解决方案是:

  • WPFClient.MainShell (exe)
  • 其他 shell dll(引导,动态模块加载,...)

  • 公司模块:

    • WPFClient.Companies.UI(视图模型和视图)
    • WPFClient.Companies.BIZ(用于验证的管理器 obj,对持久层的调用,...)
    • WPFClient.Companies.Data(持久层的通用接口)
    • WPFClient.Companies.Entities(在 ui、biz 和数据层之间共享的实体)
  • 工人模块

    • WPFClient.Workers.UI(工人管理模块的视图模型和视图)
    • ...
    • WPFClient.Workers.Entities(在 ui、biz 和数据层之间共享的实体)
  • 其他模块(例如合同、访问等)

持久层的具体实现:

  • WPFClient.Data.SQLite(引用一个或所有模块的 X.Data 和 X.Entities dll 的具体持久层)
  • WPFClient.Data.SQLServer(引用一个或所有模块的 X.Data 和 X.Entities dll 的具体持久层)
  • WPFClient.Data.????

项目之间的引用是:

  • ModuleX.UI -> ModuleX.BIZ 和 ModuleX.Entities
  • ModuleX.BIZ -> ModuleX.Entities 和 ModuleX.Data
  • ModuleX.Data -> ModuleX.Entities
  • ...Data.SQLIte -> ModuleX.Entities,ModuleX.Data,ModuleY.Entities,ModuleY.Data,...

当然具体的实现将通过 ServiceLocator 机制来解决。

我没有找到任何这样编写的 LOB 应用程序示例。我读了很多关于工作单元和实体框架、CQRS、等等等等的文章,但都是太多的理论!

这种架构有什么问题?有没有更好的解决方案或现实世界的例子可供参考?

更清楚一点:假设我必须用他的工作历史(或具有多个订单项的经典示例订单)保存一个工人。如果 biz 层“知道”它必须保存在多个存储库中,则意味着 biz 层知道持久性机制,所以它知道的太多了。但是,如果 biz 层只是将命令(SaveWorkerInfo 或 SaveOrderInfo)传递给持久层,而不是持久层知道太多,而 biz 层只执行验证(我认为这是 CQRS 样式)。

非常感谢,我知道这是一篇很长的文章!

4

1 回答 1

0

我认为你的初稿看起来不错。观看视频,获取有关如何组织应用程序结构的一些灵感。在您的最后一个问题中,您提到了存储库等,我假设您对领域驱动设计有一定的了解。我似乎需要重新考虑你的聚合。阅读CQRS 简介,您将知道该命令永远不会到达应用程序中的数据层。

于 2015-06-13T20:43:24.117 回答