gpt4 book ai didi

c# - 在 MVVM 中解耦 ViewModel

转载 作者:行者123 更新时间:2023-12-03 10:36:11 25 4
gpt4 key购买 nike

我知道在 MVVM 模式中(或者可能在任何这种设计模式中)我们应该保持我们的层解耦。根据我的理解,这也意味着我应该将我的 ViewModel 分开。我在遵守这条规则时遇到了一些麻烦。

说 - 我有一个 ConversationViewModelMessageViewModel - 前者需要创建后者的实例。当ConversationViewModel收到有关传入消息的通知它产生一个新的MessageViewModel实例并用数据填充它。

问题是 - 如果我创建新的 MessageViewModel ConversationViewModel 中明确的实例它不会使我的应用程序更难测试吗?我的意思是 - 一个代码单元是 ConversationViewModel其他是MessageViewModel - 我想分别测试两者,所以当有人在后面破坏某些东西时,对前者的测试不会受到影响。我如何实现它?

我正在使用 MVVMLight,所以我想我会注册 MessageViewModel作为一些接口(interface)的实现,然后创建一个类如 MockMessageViewModel实现相同的接口(interface),但仅用于测试。然后在ConversationViewModel我会要求 IOC 容器只给我注册的实现。这是一个好方法,还是我 react 过度?示例代码:

public class ViewModelLocator {
public ViewModelLocator() {
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

if (//in test) {
SimpleIoc.Default.Register<IMessageViewModel, MockMessageViewModel>();
}
else {
SimpleIoc.Default.Register<IMessageViewModel, MessageViewModel>();
}
}

public class ConversationViewModel : ViewModelBase {
public void MessageReceived(string data) {
//I'm thinking about doing this:
var vm = SimpleIoc.Default.GetInstance<IMessageViewModel>();
// instead of doing this
var vm = new MessageViewModel();

//do stuff with vm
}
}

最佳答案

是否使用基于接口(interface)的方法将 View 模型彼此分离是基于应用程序复杂性的设计决策。
如果要在 IConvesationViewModel 中动态创建 IMessageViewModel 的实例;我建议不要在 ViewModel 类中引用 IoC 容器,而是在 ConversationViewModel 构造函数中注入(inject)一个用于创建 IMessageViewModel 的工厂。稍后您可以使用这个工厂来创建 IMessageViewModel 的实例。工厂的简单实现可以是 Func 委托(delegate)。

public class ConversationViewModel 
{
private Func<IMessageViewModel> _messageViewModelFactory;
public ConversationViewModel(Func<IMessageViewModel> messageViewModelFactory)
{
_messageViewModelFactory = messageViewModelFactory;
}

public void MessageReceived(string data) {
var messageViewModel = _messageViewModelFactory();
}
}

这样,您将通过构造函数公开 ConversationViewModel 类的依赖项,而不是将它们隐藏在类实现中。
当您使用它创建 ConversationViewModel 对象时,Autofac 等 IoC 容器提供了在构造函数中注入(inject) Func 的方法。

关于c# - 在 MVVM 中解耦 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27584910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com