【问题标题】:Some architecture and design guidance regarding PRISM and WPF关于 PRISM 和 WPF 的一些架构和设计指南
【发布时间】:2012-11-25 00:23:02
【问题描述】:

我有几个关于使用 PRISM 框架开发 WPF MVVM 应用程序的问题:

  1. 模块化应用程序中的模块是否应该包含数据访问代码?

  2. 如果模块依赖于基础设施项目中存在的代码,例如 prism 文档中的“Stock Trader RI”,那么这不会导致这些模块和基础设施之间的紧密耦合。项目,模块不应该是自包含的功能吗!?

  3. 我喜欢 DDD(领域驱动开发)的神话,即所有代码都应该依赖于业务逻辑层,因此“依赖箭头”不应该从 BLL 中出来,而是应该进入 BLL(例如。 DAL 依赖于 BLL 中的接口,然后你可以使用 DI 容器来连接所有东西),我认为模块是应用程序的 BLL,所以我不希望它们依赖于任何东西,你能在模块化 PRISM 应用程序(如何)?

【问题讨论】:

  • 如果您更具体地了解您想在特定问题域中完成什么,这可能会很有用。最松散的可能耦合是传输纯数据object,但显然这对您的应用程序没有多大用处,除非您可以通过将其转换为某些 API(例如 ViewModel 类或接口)来赋予它某种形状.
  • 另外,您应该阅读关于松散耦合的维基百科文章。它说,“松散耦合发生在依赖类只包含一个指向接口的指针,然后可以由一个或多个具体类实现。依赖类的依赖是对接口指定的“契约”;a实现类必须提供的方法和/或属性的定义列表。任何实现接口的类都可以满足依赖类的依赖关系,而无需更改类。"
  • @RobertHarvey 我不能更具体,因为我最近问了一个更具体的问题但没有得到答案。我知道接口强加合同并提供松散耦合,但 DDD 的依赖视图使您能够将 BLL 隔离到具有公共接口的可重用库以及应用程序中的所有其他层都依赖于这些。我希望我能提供一个例子,但它不适合这里。如果可能的话,我特别希望您对第一个问题发表意见。

标签: c# .net wpf mvvm prism


【解决方案1】:
  1. 是的,因为 Prism 应用程序通常仅由模块组成,因此如果您希望在应用程序中访问数据,则必须以某种方式从模块中访问它。

  2. 管理依赖关系很重要。我尝试检查我的模块做了什么,以决定它引用我的基础设施项目是否有意义。例如,如果您正在创建一个事件日志记录模块,您可能需要考虑将该接口放在一个不是您的基础设施项目的公共库中,因为您可以将其重新用于其他项目。但是,我不介意我的项目特定模块引用基础设施项目。这些模块仍然允许我强制松散耦合,随意更换模块以添加或删除功能,或者如果我要水平而不是垂直切片应用程序,则可以交换 UI。

  3. 我不太清楚你所说的不依赖“任何东西”是什么意思。我想他们仍然依赖于 .NET 核心库。那么棱镜呢?这是允许的吗?如果您担心他们引用 Prism 或您的基础设施项目,您可以始终将 BLL 代码放在单独的 DLLS 中,您的模块引用并在其中实现模型存储库、视图模型逻辑和视图逻辑。

【讨论】:

  • 我基本上同意你的第一个答案,关于第二个如果你将日志记录或身份验证或其他“跨领域关注”放在共享库中并使 BLL 依赖于它,那不会创建紧密耦合,我认为在这种情况下使用 DI 容器的拦截机制会有很大帮助。现在对于最后一部分,你是对的,代码至少应该依赖于 .NET 框架或棱镜,但我认为这些是“稳定的依赖关系”(它们不会经常改变),根据 Mark Seemann 在他的书中.NET 中的依赖注入,没关系。
  • 如果你想让你的业务逻辑包含日志,那么它必须引用一个包含接口的库,而不一定是实现。由于您的日志接口可能是可重用的,我可能会考虑将其放入可在组织内重用的库中。要么,要么它必须进入基础设施项目。实现可以在其他地方,例如作为一个单独的模块,如果您希望它不依赖于该项目,您可以尝试阻止它引用基础设施项目。
  • 谢谢。我想你和我都同意解决方案。但似乎我只是不喜欢 prism 应用程序的组成方式。无论如何,这是个人问题。所以我会认为你的答案是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 2016-02-09
  • 2013-04-08
  • 2011-08-09
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多