Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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# 如何使用MVVM模式创建和组织与UI无关的元素_C#_Wpf_Mvvm - Fatal编程技术网

C# 如何使用MVVM模式创建和组织与UI无关的元素

C# 如何使用MVVM模式创建和组织与UI无关的元素,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在使用MVVM设计模式创建一个WPF应用程序。我最近才开始学习这两种方法,但对基础知识的工作原理有着坚实的掌握 应用程序将具有与UI无关的类,例如网络线程和消息处理程序,以及用于保存和加载设置的类 程序的这些元素与UI没有明确的联系。如何创建和初始化它们?这些是“应用程序范围”的服务,不适合特定的ViewModel,而且感觉也不像模型 有没有正确的方法可以做到这一点?什么应该“拥有”和创建这些对象?(ViewModel,或者更确切地说,将其设置为静态并自行创建?) 这里是MVVM模型的一个图

我正在使用MVVM设计模式创建一个WPF应用程序。我最近才开始学习这两种方法,但对基础知识的工作原理有着坚实的掌握

应用程序将具有与UI无关的类,例如网络线程和消息处理程序,以及用于保存和加载设置的类

程序的这些元素与UI没有明确的联系。如何创建和初始化它们?这些是“应用程序范围”的服务,不适合特定的ViewModel,而且感觉也不像模型

有没有正确的方法可以做到这一点?什么应该“拥有”和创建这些对象?(ViewModel,或者更确切地说,将其设置为静态并自行创建?)

这里是MVVM模型的一个图表,有一些调整以显示我想要的:(突出显示的文本和紫色框)

当服务器收到“用户已加入”消息时,该服务将向订阅该消息的模型发送一个事件,通知其新用户。ViewModel将看到此更改,并将用户名添加到UI中


您可以拥有链接到UI特定功能的服务。(例如,只有主窗口使用这些服务),也可以在多个窗口之间共享服务

对于第一个场景,我通常在ViewModels中实例化服务。
对于应用程序范围的服务,我宁愿在App.xaml.cs中创建实例,并将引用传递给我的viewmodel

下面是我的一个项目中的一个例子

private void Application_Startup(object sender, StartupEventArgs e)
{
    ConnectionManager connMan = new ConnectionManager();
    MainViewModel mvm = new MainViewModel(connMan);
    new MainWindow(mvm).ShowDialog();

    // TODO: save settings, etc. here

    this.Shutdown();
}
如果您的服务不依赖任何状态信息,那么也可以使用静态类。这就是我通常使用的设置管理,例如

编辑:对于您发布的示例,您必须问自己以下问题:

谁负责创建和维护network manager对象


如果它是ViewModel,则可以在其内部承载对象。如果它是由外部对象创建的,则将其传递给ViewModel。这两种方法各有利弊,我现在没有足够的信息向您推荐其中一种方法。

在这种情况下,请尝试在
视图模型中保留列表(例如
ObservalCollection
),并在模型中保留特定于模型的数据类型,如
Person
User

然后创建单独的名称空间,如
工作者
助手
管理者
,它们是只负责其特定区域的静态类。例如:
Workers/Sql/SqlWorker
Workers/Network/networkworkworker

稍后在
ViewModel
中,在相应的命令中调用这些方法


我认为这将是一个简单而高级的解决方案,因为工作人员不会相互干扰(如果仅通过抽象接口),而且他们不会连接到UI。

您可以使用DI容器并向其注册服务。如果您使用依赖注入或将DI容器仅仅用作服务定位器,那么这是个人偏好的问题

服务定位器背后的基本思想是让一个对象知道如何获取应用程序可能需要的所有服务。简单地说,ServiceLocator是一个单例注册表

依赖项注入的基本思想是有一个单独的对象,一个汇编器,用适当的实现填充lister类中的字段

一个好的实现是最好的。您可以将其用作DI容器或服务定位器