【问题标题】:WPF - MVVM Architecture (Visual Studio Solution and Projects) [closed]WPF - MVVM 架构(Visual Studio 解决方案和项目)[关闭]
【发布时间】:2014-07-09 06:26:56
【问题描述】:

我正在开发一个 MVVM 模式的 Window-App WPF 项目。目前,该应用程序有点简单(无法真正解释产品的性质),但最终它有望成长为更复杂的应用程序。

  • wpf winapp 有一个本地数据库,还连接到一个 REST 服务。
  • 开发时间并不是真正的首要问题;但可维护性和可测试性。
  • 将使用 IOC 容器和 DI
  • 计划做 1 个 ViewModel 就是做 1 个 View
  • 我不想使用任何 WPF/MVVM 框架,因为这是我第一次使用 WPF-MVVM 应用程序(就像第一次在裸 DOM javascript 中编码,即使有 jquery)。

我决定使用多个项目,目前我的想法如下:

  1. Product.Windows.Common(实用程序、日志记录、帮助程序等)
  2. Product.Windows.Entities(数据库和 REST 实体)
  3. Product.Windows.Contracts(所有接口都将驻留在此命名空间/项目中)
  4. Product.Windows.Data(用于本地数据库)
  5. Product.Windows.ServiceClients(用于 REST 客户端)
  6. Product.Windows.App(主 WPF 项目,包含 Views/XAML)
  7. Product.Windows.Models(INPChanged)
  8. Product.Windows.ViewModels(INPChanged 和 ICommands)
  9. Product.Windows.Tests(单元测试)

我只想问:

  1. 这个架构是不是有点矫枉过正了?

  2. 我是否需要为业务逻辑创建一个 Product.Windows.Business?还是应该将业务逻辑放在 ViewModel 中?

提前谢谢你:)

【问题讨论】:

  • 许多好的问题会根据专家的经验产生一定程度的意见,但这个问题的答案往往几乎完全基于意见,而不是事实、参考资料或特定的专业知识。 因此,我已投票结束此问题。

标签: c# .net wpf mvvm architecture


【解决方案1】:

我目前正在开发具有类似结构的应用程序。项目结构看起来不错。在我的项目中,我做的事情有点不同。

Data 和 ServiceClients 程序集可能代表您的 DAL。很好,这些在不同的组件中是分开的。在数据程序集中,您将拥有存储库,在 ServiceClients 中,您将拥有服务代理。实体和合同程序集可能代表您的 BL。在这里,我认为您可以使用单个程序集。这个程序集应该被两个 DAL 程序集引用。

单独实现日志记录很好,如果您有安全性,这也应该在 Common 中实现。根据我最近读到的一本好书,.NET 中的依赖注入,实用程序和帮助程序是设计不佳/不完整的结果。这些类通常包含静态方法。但我认为这与讨论无关。

在我的项目中,我通常在与视图相同的程序集中实现 VM。这包括 RelayCommand(ICommand 实现)和实现 INPC 的 ViewModelBase。

我最近观看了 Robert Martin 的演讲。据我所知,他说过应用程序的架构应该尖叫应用程序的功能。类不应分组在称为(MVC 或 MVVM)的项目或文件夹中。这并没有告诉我们该应用程序的功能。类应该按照它们所做的事情、它们实现的特性来分组。我还没到这个阶段。我仍在对像你这样的东西进行分组:)。

我看到您只有一个测试项目。如果您在此项目中为您计划测试的所有程序集添加目录,这也可能很好。如果您不这样做,则很难找到特定程序集的测试。您可能希望为计划测试的每个程序集添加测试项目。

【讨论】:

  • 感谢@flo_badea 的想法 :) p2 - 太好了,我们同意 Data 和 ServiceClients。 p3 - 是的,计划将 Security 放在 Common。我可能仍会继续在 utils 和 helpers 上使用 DI(用于将来可能的多种实现)p4 - 感谢您对组合它们的想法。也会考虑一下 p5 - 很棒的想法! p6 - 是的,计划在测试项目中为每个程序集添加文件夹。
  • 转念一想,我认为你是对的。我将切换到使用静态方法将 utils/helpers 制作为类。
  • 我所说的 utils 是指这些 utils 类通常包含静态方法。根据我所读到的,这是由于设计不足。我将以我当前的项目为例。到目前为止,它不包含任何 utils 类。顺便说一句,我没有提到这一点,如果你觉得舒服的话,你应该尝试使用 DI。我也在我目前的项目中这样做。这是我第一个在所有东西上应用 DI 的项目,而且效果很好。该应用还具有高度可测试性。
【解决方案2】:

您可以根据需要组织组件,但我更喜欢以下结构: - 为项目中的每个屏幕创建 2 个类库 (dll)(其中一个具有此屏幕的视图 + 视图模型,另一个 dll 具有它的业务逻辑),因此您可以将视图和视图模型与另一个业务逻辑一起使用,并且您也可以在每个屏幕业务/视图中单独更改、更新,当您更换 dll 时更新将起作用。

  • 使用所有组件,除了: Product.Windows.ViewModels Product.Windows.Models

【讨论】:

  • 实际上,永远不会在另一个应用程序中重新编译 same 视图和 same 视图模型。您的视图是为您的演示模式量身定制的,您的视图模型是为您的应用程序逻辑和数据模型量身定制的。应用程序之间几乎没有共享空间。
  • 好的,在我的情况下,我在应用程序之间共享屏幕视图,但您可以为每个屏幕使用一个 dll(视图 + 视图模型 + 业务)。
  • 我有超过 25 个不同的视图。我真的想要 25 个 dll 吗?
  • @Gusdor 是的,视图数量决定 DLL 的数量似乎不对
  • @WaelGamal - 我已将模型和视图模型合并到主 WPF 应用程序中(很像控制器在 ASP.NET MVC 项目中的方式)
【解决方案3】:
  1. 这有点矫枉过正,但我​​认为只有你可以保证你自己的程序。我想我会将 Contracts 放在 CommonEntities 中(取决于功能)。另外,我认为您不需要将 View 和 ViewModel 完全分开。如果它们在同一个项目中,它还将简化更改/调试过程。

  2. 如果您的程序是客户端,那么您可以在 ViewModel 中使用 BL(至少在不太复杂的情况下)。如果你有一个主服务器和多个客户端,那么你不应该在你的 ViewModel 中实现 ANY 逻辑(除了化妆品),是的,创建一个新项目

【讨论】:

  • 谢谢! #1 - 好主意,我已经将模型和视图模型合并到主 WPF 应用程序中(很像控制器在 ASP.NET MVC 项目中的方式)#2 - 这是客户端,所以这是 ViewModel 中逻辑的 1 票.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2010-09-07
  • 1970-01-01
相关资源
最近更新 更多