0

我刚开始使用 WPF,并尝试以 MVVM 方式做事(在这篇精彩的文章之后)。

我有一个所有视图模型都需要与之交互的中央管理器类。我使用单例实现了这个,所以我有我的单例类:

public class FakeManager
    {

        private FakeManager() {}

        static FakeManager instance;
        public static FakeManager Instance
        {
            get { return instance ?? (instance = new FakeManager()); }
        }

        ...
    }

在我的视图模型中,我像这样与之交互:

public ICommand TriggerChannelChange
{
    get
    {
        return new RelayCommand(() => FakeManager.Instance.SetupChangeRequest(_hardwareItem), () => true);
    }
}

我的问题是 - 有没有更好的方法?我知道 WPF 中通常用于在 ViewModel 之间发送消息的事件调解器模式,这在这里会更好吗?我想我所做的事情的问题是我与 FakeManager 紧密耦合,而且感觉有点笨拙。

谢谢

4

2 回答 2

1

首先,我同意 blinmeis 的观点,即在属性 getter 中创建新命令违反了属性 getter 的一般期望,包括:

  • 它们非常轻巧
  • 他们返回相同的对象,除非它被替换(可能通过设置器)

但这是一个旁白,所以我不会努力。

至于您的问题,我建议您研究一种服务模式,即您为服务定义一个接口,然后您的视图模型依赖于该服务。他们获得服务的方式多种多样。您可能想从服务定位器模式开始,或者研究依赖注入MEF

于 2012-10-12T12:56:36.037 回答
1

您已经提到的发布/订阅者模式将是我在这里的首选方法。Prism 与EventAggregator.

像这样设置它的好处是,除了代码解耦之外,您可以以更清晰的方式推理您的问题域。您可以将您的视图模型作为独立的“岛屿”,通过系统发送定义明确的(以领域语言)消息。视图模型不必知道其他部分如何作用于它们。这些消息在概念上是系统的一个组成部分,值得这样建模。它还简化了测试并大大简化了引入新功能和修复与这些消息交互的错误的任务。

于 2012-10-12T13:37:44.923 回答