在使用MVVM的WPF中,谁负责管理外部通信?

时间:2019-07-12 14:28:29

标签: c# wpf mvvm

我需要使用MVVM创建WPF应用程序,该应用程序将具有蓝牙连接管理器和自定义硬件管理器。

我应该把这些经理放在哪里?

在ViewModel中?在模型中?在视图之外,ViewModel和模型?

谢谢

2 个答案:

答案 0 :(得分:1)

在项目之外。


分开关注。

使用ICommunication&Communication类创建一个新的Communication项目。

如果要向前迈进-您可以实施一个通讯服务器项目来处理所有通讯。 您还将需要通讯客户端-这是您将从MVVM-WPF项目中引用的项目

为什么? 1.有一天,您将添加其他通信方式-添加另一个通信项目将更加容易和清洁。 2.有一天您将更新您的通讯方式-这很容易 只是要更改DLL。

编辑: 关于MVVM项目: *视图模型完全没有逻辑 *从通信项目到模型进行依赖注入,并注册到传入的信息

答案 1 :(得分:1)

在MVVM体系结构中,没有“视图,视图模型和模型之外” 。与UI相关的所有内容都是View。视图绑定源/目标的一切都是视图模型。其他一切都是模型。
MVVM的目的是使用绑定和视图模型将视图与业务逻辑分离。

因此,可以肯定的是,蓝牙服务(或硬件管理器)将是该模型的一部分。 但是如果它创建必须向用户显示的数据,您 还需要引入一个视图模型来访问服务模型呈现相应的UI控件的服务视图。因此,在“最坏的情况”下,服务和管理器将扩展并跨越应用程序边界(明智的MVVM)。

  

我认为乍一看,它们[模型对象]必须在ViewModel类中实例化。问题是,这正确吗?

MVVM dependency graph

image source

是的,这是正确的。在检查依赖关系图时,您将意识到该模型对视图模型(或视图模型的知识)和视图没有依赖性。箭头从视图模型指向模型。这需要视图模型实例化对该模型的引用。首选方法是使用构造函数注入。然后,视图创建视图模型实例(因为箭头从一个视图指向另一个视图模型)。这是实现依赖关系图的唯一方法。
在进行依赖项注入的情况下,所有实例都在IoC容器之类的集中位置创建。箭头将从该容器指向应用程序(单向)。