【问题标题】:How to create and organize non UI related elements using the MVVM pattern如何使用 MVVM 模式创建和组织非 UI 相关的元素
【发布时间】:2014-09-27 18:55:48
【问题描述】:

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

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

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

有没有正确的方法来做到这一点?什么应该“拥有”并创建这些对象? (ViewModel,或者更确切地说是让它们静态并自己创建?)

这是 MVVM 模型的示意图,进行了一些调整以显示我正在寻找的内容:(突出显示的文本和紫色框)

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

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    您可以拥有与 UI 的特定功能相关联的服务。 (例如,只有主窗口使用它们)并且还可以在许多窗口之间共享服务。

    对于第一种情况,我通常在 ViewModel 中实例化服务。
    对于应用程序范围的服务,我宁愿在 App.xaml.cs 中创建实例并将引用传递给我的视图模型。

    这是我的一个项目中的一个示例。

    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();
    }
    

    如果您的服务不依赖任何状态信息,您也可以使用静态类。例如,这就是我通常用于设置管理的方法。

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

    谁负责创建和维护网络管理器对象?

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

    【讨论】:

      【解决方案2】:

      您可以使用 DI 容器并使用它注册您的服务。如果您使用依赖注入或将 DI 容器仅用作服务定位器,则取决于个人喜好。

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

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

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

      【讨论】:

        【解决方案3】:

        在这种情况下,请尝试在ViewModel 中保留一个列表(例如ObservablleCollection<T>),并在模型中保留特定于模型的数据类型,如PersonUser

        然后创建单独的命名空间,例如WorkersHelpersManagers,它们是静态 类,仅负责其特定区域。例如:Workers / Sql / SqlWorkerWorkers / Network / NetworkWorker

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

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

        【讨论】:

          猜你喜欢
          • 2022-10-03
          • 1970-01-01
          • 2015-04-26
          • 1970-01-01
          • 2012-07-14
          • 2011-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多