Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-MVVM体系结构(VisualStudio解决方案和项目)_C#_.net_Wpf_Mvvm_Architecture - Fatal编程技术网

C# WPF-MVVM体系结构(VisualStudio解决方案和项目)

C# WPF-MVVM体系结构(VisualStudio解决方案和项目),c#,.net,wpf,mvvm,architecture,C#,.net,Wpf,Mvvm,Architecture,我正在MVVM模式下开发一个Windows应用程序WPF项目。目前,这个应用程序有点简单(不能真正解释产品的本质),但最终它有望发展成一个更复杂的应用程序 wpf winapp有一个本地数据库,还连接到REST服务 开发时间并不是最重要的问题;但是可维护性和可测试性 将使用IOC容器和DI 计划执行1视图模型是1视图 我不想使用任何WPF/MVVM框架,因为这是我第一次使用WPF-MVVM应用程序(就像第一次使用裸DOM javascript编码一样,即使有jquery) 我决定使用多个项目

我正在MVVM模式下开发一个Windows应用程序WPF项目。目前,这个应用程序有点简单(不能真正解释产品的本质),但最终它有望发展成一个更复杂的应用程序

  • wpf winapp有一个本地数据库,还连接到REST服务
  • 开发时间并不是最重要的问题;但是可维护性和可测试性
  • 将使用IOC容器和DI
  • 计划执行1视图模型是1视图
  • 我不想使用任何WPF/MVVM框架,因为这是我第一次使用WPF-MVVM应用程序(就像第一次使用裸DOM javascript编码一样,即使有jquery)
我决定使用多个项目,以下是我到目前为止的想法:

  • Product.Windows.Common(UTIL、日志、帮助程序等)
  • 产品.Windows.Entities(数据库和REST实体)
  • Product.Windows.Contracts(所有接口都将驻留在此命名空间/项目中)
  • Product.Windows.Data(用于本地数据库)
  • Product.Windows.ServiceClients(适用于REST客户端)
  • Product.Windows.App(主WPF项目包含视图/XAML)
  • 产品.Windows.Models(已更改)
  • Product.Windows.ViewModels(INPChanged和ICommands)
  • 产品.Windows.Tests(单元测试)
  • 我只想问:

  • 这是不是有点过分了

  • 是否需要为业务逻辑创建Product.Windows.Business?或者我应该把业务逻辑放在ViewModels中吗


  • 提前感谢:)

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

    • 使用除以下组件之外的所有组件: Product.Windows.ViewModels Product.Windows.Models

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

    数据和ServiceClient程序集可能代表您的DAL。很好,它们在不同的组件中分开。在数据程序集中,您将拥有存储库,在ServiceClient中,您将拥有服务代理。实体和契约程序集可能代表您的BL。在这里,我认为您可以使用单个程序集。两个DAL程序集都应引用此程序集

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

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

    我最近看了罗伯特·马丁的演讲。就我所记得的,他说应用程序的架构应该尖叫应用程序的功能。类不应分组在名为(MVC或MVVM)的项目或文件夹中。这并没有告诉我们该应用程序的功能。类应该按照它们所做的事情和它们实现的特性进行分组。我还没到这个阶段。我仍然在对像你这样的东西进行分组:)

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

  • 这有点过分了,但我认为只有你能为自己的计划担保。我想我会把合约放在普通实体里面(取决于功能)。此外,我认为不需要完全分离视图和ViewModel。如果它们在同一个项目上,它还可以简化更改/调试过程

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


  • 实际上,人们永远不会在另一个应用程序中重新编译相同的视图和相同的视图模型。您的视图是为您的表示模式定制的,您的视图模型是为您的应用程序逻辑和数据模型定制的。在应用程序之间几乎没有共享的空间。好的,在我的例子中,我在应用程序之间共享屏幕视图,但是你可以为每个屏幕使用一个dll(视图+视图模型+业务)。我有超过25个不同的视图。我真的想要25个DLL吗?@Gusdor是的,视图的数量决定DLL的数量似乎不正确s@WaelGamal-我已经将模型和ViewModels组合到主WPF应用程序中(很像ASP.NET MVC项目中的控制器),感谢@flo_badea的想法:)p2-很好,我们在数据和服务客户端方面达成一致。p3-是的,计划在公共区域设置安全设施。我可能仍然会继续使用关于utils和helpers的DI(对于将来可能的多个实现)p4-感谢您考虑将它们结合起来。我也会想一想的,p5-这方面的想法很棒!p6-是的,计划在th中为每个部件添加文件夹