c# - 使用 EventAggregator 和 ViewModel 注册类型

标签 c# wpf mvvm unity-container eventaggregator

我不明白我们如何注册IEventAggregator实例,以便我们可以将其注入(inject) ViewModel .

示例:

我定义我的MainViewModel :

...
private IEventAggregator _eventAggregator;

public MainViewModel(IEventAggregator eventAggregator) {
    _eventAggregator = eventAggregator;
    ...
}
...

然后,我需要以某种方式注册一个实现 IEventAggregator 的类我想注入(inject)我的 ViewModel .

在我的ModuleInit类,我会有这样的东西:

...
private IUnityContainer _container;

public ModuleInit(IUnityContainer _container) {
   _container = container;
}
...
public void Initialize() {
   container.RegisterType<IEventAggregator, ___(something)___>();
   ...
}

在我的MainViewModel类,我也可以实现_eventAggregator = ServiceLocator,Current.GetInstance<IEventAggregator>(); ,但我在概念上并不真正理解我在做什么。该程序正常运行...

我真的很想了解什么ServiceLocator实际上正在做什么,以及我应该做什么来正确地向我的容器注册类型。我没有定义实现 IEventAggregator 的类,那么ServiceLocator在哪里获取实例?然后我必须注册什么,以便当我解决某些问题时,例如我的 ViewModel ,它将创建一个新的 EventAggregator实例?

最佳答案

事件聚合器:

Prism 库有一个可供您使用的默认 EventAggregator。 如果您使用 Prism < 5.0,则它位于 Microsoft.Practices.Prism.Events 中;如果您使用 Prism >= 5.0Microsoft.Practices.Prism.PubSubEvents 中>

另外,如果您使用来自UnityExtensionsUnityBootstrapper,我怀疑这是因为您也在使用模块,那么所有构建的服务(包括EventAggregator) 将在 prism 中为您注册:

class MyBootstrapper : UnityBootstrapper
{
    protected override void ConfigureContainer()
    {
        // the base.ConfigureContainer setup all build in prism services
        base.ConfigureContainer();

        //register your own stuff
    }
}

服务定位器:

ServiceLocator 只是一个静态包装器,它联系 IUnityContainer 的当前实例进行解析。您应该永远使用ServiceLocator来获取解析,除非没有其他可能的方法(例如在静态构造函数中)。这种模式称为“服务定位器模式”,通常不受欢迎。

UnityContainer:

容器的工作是创建注册到特定接口(interface)的任何类的实例,监视它们的生命周期,并重用实例(如果指定)。 因此,当您注册时:

container.RegisterType<IEventAggregator, EventAggregator>();

...当类构造函数具有 IEventAggregator 类型的参数时,您只需指示容器返回 EventAggregator 的实例即可。

但是,如果您只希望注册类的单个实例,那么您需要指定生命周期管理器:ContainerControlledLifetimeManager,如下所示:

... , EventAggreagator>(new ContainerControlledLifetimeManager());

这指示容器在每次请求时重用相同的实例。 使用RegisterType时的默认生命周期管理器是TransientLifetimeManager,它将指示容器每次创建一个新实例。

注意:如果您在某个时刻使用 RegisterInstance,请注意默认的生命周期管理器是 ContainerControlledLifetimeManager,而不是 transient 。

进一步阅读:

我建议您阅读依赖注入(inject)控制反转,这正是您想要做的。也许还有棱镜如何工作的教程。

干杯

关于c# - 使用 EventAggregator 和 ViewModel 注册类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29814697/

相关文章:

wpf - 变更跟踪和并发 - 这会失败吗?

c# - WPF mvvm 绑定(bind),获取/设置值 : issue with preventing update value

c# - CUIT(编码的 UI 测试)+ MVVM——我现在必须开始命名我的所有控件吗?

c# - 如何检测Windows 10 S?

c# - 在 ASP.NET Core 应用程序中使用 NLog

c# - 如何结合两个 ObservableCollection 来绑定(bind)动态按钮

c# - 当字体不支持符号时,如何在WPF文本框中插入版权,商标,服务标记等

c# - 将 MVVM 与(仅)从集合中自动生成的某些列绑定(bind)

c# - 如何在 C# 代码隐藏中调用具有返回值的 Javascript 函数

c# - Microsoft Graph CSharp SDK 和过滤 - 如何构建对 CreatedDateItem 上过滤器的调用?