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.Models
。 Collections
和数据提供者部分是文件夹,以及所有第二级以上的项目,例如。 Enums
, Images
, Commands
等
大多数人使用你提到的“标准”结构:
- 模型/
- 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解决的接口。