c# - MVVM Light 按键注册界面

标签 c# mvvm dependency-injection mvvm-light

我有模块化 WPF 应用程序。在我想要的每个模块中都有自己的 Messenger。因为我想在模块内发送一些消息(没有 token )。

第一个模块:

namespace NS1
{
  public class MainViewModel : ViewModelBase
  {
    public MainViewModel(IMessenger messenger) : base(messenger)
    {
      .......            
    }   
  }
  public class Module1
  {
    Messenger Messenger1;
    static Module1()
    {
      Messenger1 = new Messenger();
      SimpleIoc.Default.Register<IMessenger>(() => Messenger1);
      SimpleIoc.Default.Register<MainViewModel>();
    }        
  }
}

第二个模块:
namespace NS2
{
  public class MainViewModel : ViewModelBase
  {
    public MainViewModel(IMessenger messenger) : base(messenger)
    {
      .......            
    }   
  }
  public class Module2
  {
    Messenger Messenger2;
    static Module2()
    {
      Messenger2 = new Messenger();
      SimpleIoc.Default.Register<IMessenger>(() => Messenger2);
      SimpleIoc.Default.Register<MainViewModel>();
    }        
  }
}

当然我有错误
SimpleIoc.Default.Register<IMessenger>(() => Messenger2);

我如何注入(inject) Messenger1MainViewModelNS1Messenger2MainViewModelNS2 ?

还是有其他方法? token 很好,但我必须确保在不同的模块中没有相同的 token !

最佳答案

您需要使用 SimpleIoc 中的键注册 Messenger 接口(interface)的每个单独实例。

要获得正确的实例,您还需要使用相同的 key 。
所以恐怕不可能注入(inject)构造函数......你需要使用 GetInstance 方法。

代码示例如下

IMessenger m1 = new Messenger();
IMessenger m2 = new Messenger();

SimpleIoc.Default.Register<IMessenger>(() => m1, "Msg1");
SimpleIoc.Default.Register<IMessenger>(() => m2, "Msg2");

var t = SimpleIoc.Default.GetInstance<IMessenger>("Msg1");
var s = SimpleIoc.Default.GetInstance<IMessenger>("Msg2");

关于c# - MVVM Light 按键注册界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43137369/

相关文章:

wpf - WPF:逐步绑定(bind)MVVM中的TreeView教程

c# - 在C#或Java中实现大规模并行计算引擎的线程替代方法?

c# - 从 ElementTree 的根传递元素作为 CommandParameter

c# - TcpClient ConnectAsync 获取状态

wpf - MVVM - 如何将 View 模型绑定(bind)到 View

angular - 为什么我们应该在 Angular 单元测试中使用 Jasmine Spy 对象?

c# - unity RegisterInstance IDisposable对象

c# - MVC5 和 Ninject 的依赖注入(inject)失败

c# - 我可以从另一个引用的程序集继承 WPF 项目的程序集版本吗?

c# - MSTest - 确定或指定测试是在开发箱上运行还是在构建器上运行的最佳方式