WPF中MVVM的项目结构

在WPF中使用MVVM时,最终的项目结构是什么?

从我现在看到的教程中,他们通常有文件夹:Model,ModelView和View。

在模型中,你把像Person这样的类放在捕获数据和逻辑的地方。

在ModelView中,您可以实例化在Model中定义的类。 该视图包含.xaml文件。

编辑:我编辑我原来的post发送一个示例项目结构。 我有这个问题。 如何组织这些:App.config App.xaml MainWindow.xaml

我应该像现在一样离开他们,还是应该把他们放在一个文件夹里?

在这里输入图像说明

您已经描述了常用或常用的文件夹布局。 根据经验,我更喜欢为模型数据types添加一个单独的文件夹(或大型应用程序中的项目),例如您提到的典型Person类。 我这样做的原因是因为这经常成为最大的项目之一。 我也将它分成以下子文件夹:

 DataTypes Collections Enums Interfaces 

我还为应用程序Converter类,扩展方法类,实用程序(或服务)类提供单独的文件夹(或大型应用程序中的项目)。 最后,我有几乎与应用程序文件夹结构相匹配的testing项目。 总的来说,这大致是我的文件夹的样子:

 Solution Third Party Libraries <<< (Solution Folder) StartUp Project Images Resources Converters DataTypes Collections Enums Interfaces <<< (For Data Type classes) Extensions Models Data Controllers Data Providers Interfaces <<< (For swapping Model classes out in test projects) Utilities (Or Services) Interfaces <<< (For swapping Utilities classes out in test projects) View Models Commands Views Attached Properties Controls 

更新>>>

像文件夹一样,项目只是提供分离的层次。 他们还帮助我绘制出我的应用程序名称空间。 例如, Collections文件夹/项目中的代码类将位于ApplicationName.DataTypes.Collections命名空间中。 Data Providers文件夹/项目中的类将具有ApplicationName.Models.DataProviders命名空间。

此外,在大型应用程序中,我的项目名称来自它们在此层次结构中的位置…例如,我的DataTypes项目实际上称为ApplicationName.DataTypes而我的Models项目称为ApplicationName.ModelsCollections和数据提供者部分是文件夹,以及所有第二级以上的项目,例如。 EnumsImagesCommands

大多数人使用你提到的“标准”结构:

  • 模型/
    • CarModel.cs
    • DriverModel.cs
  • 视图模型/
    • CarViewModel.cs
    • DriverViewModel.cs
  • 视图/
    • CarView.xaml
    • DriverView.xaml

我认为它受欢迎的原因是因为有些人会争辩说,你应该能够把Models,ViewModels和Views放在不同的程序集中。

也有了这个结构,您可以轻松地为其他WPF的东西添加文件夹: Converters/Resources/

在我的团队中,我们使用这种结构,但我们复数名称(如Models / ViewModels / Views)。

但是,大多数情况下,模型类是在其他程序集/名称空间中定义的; 在这种情况下,我们甚至没有Models/文件夹。

对于大型项目,我们将子文件夹添加到Models/ViewModels/Views/

为了完整起见,值得一提的是,你可能会发现一些使用“特征驱动”结构的人:

  • 汽车/
    • CarModel.cs
    • CarViewModel.cs
    • CarView.xaml
  • 驱动器/
    • DriverModel.cs
    • DriverViewModel.cs
    • DriverView.xaml

但是这是非常罕见的。

朋友们,我发现类似于这个问题的解决scheme是创build一个单独的项目,WPFtypes,我称为启动,只与App.xaml(和App.xaml.cs)。

其中我指的是View和ViewModel的项目。 所以这个观点没有依赖性,ViewModel只能“看”到View和Business。

在App.xaml.cs声明和实例化我的MainWindow,然后加载我的应用程序的一些基本属性,并导航到页面login(我正在与一个窗口和浏览其中的几个页面)。

在这里输入图像说明

我通常会这样做:

  • 主要应用程序(.exe) – 全局风格等
  • Common WPF – WPF的基类和助手
  • Common Lib General – 基础类和模型的助手
  • 基础架构 – dependency injection,日志logging等
  • VM的接口
  • M的接口
  • 包含视图和相应ViewModels的几个库 – 这里也可以分割
  • 几个包含模型的库

所有依赖关系都基于只通过DI解决的接口。