.net 如何在使用DispatcherObject.Dispatcher时防止MVVM中的循环引用

.net 如何在使用DispatcherObject.Dispatcher时防止MVVM中的循环引用,.net,wpf,mvvm,dispatcher,circular-reference,.net,Wpf,Mvvm,Dispatcher,Circular Reference,下面的代码非常简单。我试图抽象一个调度程序上下文,以便我的视图模型能够同步只能在GUI线程上引发的事件 在这个模式中有一个循环引用。是否有其他方法来创建DispatcherObject?我做错了吗 我读过其他类似的问题,但答案似乎都涉及到ViewModel中的DispatcherObject。这是一个可接受的循环参考的地方吗 class ViewModel { public DispatcherObject Dispatcher { get; set; } } class ModelV

下面的代码非常简单。我试图抽象一个调度程序上下文,以便我的视图模型能够同步只能在GUI线程上引发的事件

在这个模式中有一个循环引用。是否有其他方法来创建
DispatcherObject
?我做错了吗

我读过其他类似的问题,但答案似乎都涉及到
ViewModel
中的
DispatcherObject
。这是一个可接受的循环参考的地方吗

class ViewModel {
    public DispatcherObject Dispatcher { get; set; }
}

class ModelView : UserControl {

    ModelView() {
        InitializeComponent();
        DataContext = new ViewModel { Dispatcher = this };
    }
}

不需要从控件获取特定的调度程序。您可以直接通过部署进行调度,即Deployment.Current.Dispatcher.BeginInvoke(()=>something)


我通常不提供dispatcher对象,而是提供一个action委托。然后,您可以在不跳线程的情况下进行测试,只执行操作,而在生产环境中,它可以在调度程序上调用。

无需从控件获取特定的调度程序。您可以直接通过部署进行调度,即Deployment.Current.Dispatcher.BeginInvoke(()=>something)


我通常不提供dispatcher对象,而是提供一个action委托。然后,您可以在不跳转线程的情况下进行测试,只执行操作,而在生产环境中,它可以在调度程序上调用。

一般来说,循环引用是您希望避免的。这里有两种选择:

1.静态地抓取调度器 又快又脏的方法。很容易做到,几乎在任何时候都可以很好地工作,但是与其他静态完成的工作一样,它不适合测试性(这可能是个问题,也可能不是问题)。在WPF应用程序拥有多个UI线程的罕见情况下,您将无法盲目使用这种方法

WPF:
var dispatcher=Application.Current.dispatcher

Silverlight:
var dispatcher=Deployment.Current.dispatcher

2.使调度程序成为ViewModel的依赖项
适当配置依赖项注入容器,并使
Dispatcher
成为需要访问它的ViewModels的依赖项。这种方法比较麻烦,但它允许您使用多个UI线程,是可测试的,并且通常具有使用DI进行操作的所有优点/缺点。

一般来说,循环引用是您希望避免的。这里有两种选择:

1.静态地抓取调度器 又快又脏的方法。很容易做到,几乎在任何时候都可以很好地工作,但是与其他静态完成的工作一样,它不适合测试性(这可能是个问题,也可能不是问题)。在WPF应用程序拥有多个UI线程的罕见情况下,您将无法盲目使用这种方法

WPF:
var dispatcher=Application.Current.dispatcher

Silverlight:
var dispatcher=Deployment.Current.dispatcher

2.使调度程序成为ViewModel的依赖项
适当配置依赖项注入容器,并使
Dispatcher
成为需要访问它的ViewModels的依赖项。这种方法比较麻烦,但它允许您使用多个UI线程,是可测试的,并且通常具有使用DI进行操作的所有优点/缺点。

当您实际需要调用的是dispatcher本身时,为什么要保留对DispatcherObject的引用

class ViewModel {
    public Dispatcher Dispatcher { get; set; } }

class ModelView : UserControl {

    ModelView() {
        InitializeComponent();
        DataContext = new ViewModel { Dispatcher = Dispatcher };
    } }

当调用实际需要的是dispatcher本身时,为什么要保留对DispatcherObject的引用

class ViewModel {
    public Dispatcher Dispatcher { get; set; } }

class ModelView : UserControl {

    ModelView() {
        InitializeComponent();
        DataContext = new ViewModel { Dispatcher = Dispatcher };
    } }

感谢您的响应,但看起来部署类是Silverlight-only。这让我想到了WPF中类似的概念:Dispatcher.CurrentDispatcher。感谢您的响应,但看起来部署类是Silverlight-only。这让我想到了WPF中类似的概念:Dispatcher.CurrentDispatcher。谢谢我采用了一种两者结合的方法。ViewModel的抓取是静态定义的调度程序,静态实例可以通过应用程序、单元测试等进行更新。我还问了另一个关于application.Current.Dispatcher和Dispatcher.CurrentDispatcher之间区别的问题。谢谢。我采用了一种两者结合的方法。ViewModel的grab是静态定义的Dispatcher,静态实例可以通过应用程序、单元测试等进行更新。我还问了另一个关于application.Current.Dispatcher和Dispatcher.CurrentDispatcher之间差异的问题: