使用 EventAggregator 和 ViewModel 注册类型

RegisterType with EventAggregator and ViewModel

我不明白我们如何注册一个 IEventAggregator 实例以便我们可以将它注入到 ViewModel.

示例:

我定义我的 MainViewModel:

...
private IEventAggregator _eventAggregator;

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

然后,我需要以某种方式注册一个 class 来实现 IEventAggregator,我想在我的 ViewModel.

中注入

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

...
private IUnityContainer _container;

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

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

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

Microsoft Prism 框架有 Microsoft.Practices.Prism.Events.EventAggregator class 实现了 IEventAggregator。假设你已经通过扩展 UnityBootstrapper 实现了你的 BootStrapper,正如我记得的那样,它已经注册 IEventAggregatorEventAggregator class 因此你不需要再做一次。 使用 UnityContainer 解析 IEventAggregator 会给你 EventAggregator 单例实例。

您的 ServiceLocator 在内部调用 container.Resolve 以获取 EventAggregator 实例,因此它适合您。

EventAggregator:

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

,它位于 Microsoft.Practices.Prism.PubSubEvents

此外,如果您使用 UnityExtensions 中的 UnityBootstrapper,我怀疑这是因为您也在使用模块,那么 prism 中的所有内置服务(包括 EventAggregator)都将为您注册:

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

        //register your own stuff
    }
}

服务定位器:

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

Unity容器:

容器的工作是创建任何 class 注册到特定接口的实例,监控它们的生命周期,并在指定的情况下重用实例。 所以当你注册时:

container.RegisterType<IEventAggregator, EventAggregator>();

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

但是如果你只希望注册的单个实例class,那么你需要指定生命周期管理器:ContainerControlledLifetimeManager,像这样:

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

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

注意:如果您在某些时候使用 RegisterInstance,请注意默认的 lifetimeManager 是 ContainerControlledLifetimeManager,而不是 transient。

进一步阅读:

我建议您阅读 依赖注入 控制反转 ,这正是您想要做的。也可能是棱镜工作原理的教程。

干杯