WPF中MVVM的项目结构

时间:2013-09-16 10:33:11

标签: c# wpf xaml mvvm

在WPF中使用MVVM时,您最终会得到什么样的项目结构?

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

在模型中,您可以放置​​像Person这样的类来捕获数据 和逻辑。

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

编辑:我编辑原始帖子以发送示例项目结构。 我有与此有关的问题。我如何组织这些: App.config中 App.xaml中 MainWindow.xaml

我应该像现在一样将它们留在外面,还是应该把它们放在某个文件夹中?

enter image description here

4 个答案:

答案 0 :(得分:58)

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

DataTypes
    Collections
    Enums
    Interfaces

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

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

更新&gt;&gt;&gt;

项目(如文件夹)只提供分离级别。它们还帮助我绘制我的应用程序命名空间。例如,Collections文件夹/项目中的代码类将位于ApplicationName.DataTypes.Collections命名空间中。 Data Providers文件夹/项目中的类将具有ApplicationName.Models.DataProviders命名空间。

此外,在大型应用程序中,我的项目名称来自它们在此层次结构中的位置...例如,我的DataTypes项目实际上被称为ApplicationName.DataTypes并且我的Models项目被调用ApplicationName.ModelsCollectionsDataProviders部分是文件夹,以及超过第二级的所有项目,例如。 EnumsImagesCommands

答案 1 :(得分:20)

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

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

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

使用此结构,您可以轻松地为其他WPF内容添加文件夹:Converters/Resources/等。

在我的团队中,我们使用此结构,但我们将名称复数化(因此模型/ ViewModels / Views)。

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

对于大型项目,我们会在Models/ViewModels/Views/

中添加子文件夹

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

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

但这种情况非常罕见。

答案 2 :(得分:2)

我通常会这样:

  • 主要应用程序(.exe) - 全局样式等
  • Common Lib WPF - WPF的基本类和助手
  • Common Lib General - 基础类和模型助手
  • 基础设施 - 依赖注入,记录等
  • VM的接口
  • M
  • 的接口
  • 包含视图和相应ViewModel的多个库 - 也可以在此处拆分
  • 包含模型的几个库

所有依赖项都基于仅通过DI解析的接口。

答案 3 :(得分:2)

朋友们,我发现类似问题的解决方案是创建一个单独的项目,类型WPF,我称之为Startup,只有App.xaml(和App.xaml.cs)。

在其中我指的是View和ViewModel的项目。因此视图没有依赖性,ViewModel只“看到”视图和业务。

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

enter image description here