RegisterType与EventAggregator和ViewModel

Bry*_*ant 2 c# wpf unity-container mvvm eventaggregator

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

例:

我定义了我的MainViewModel:

...
private IEventAggregator _eventAggregator;

public MainViewModel(IEventAggregator eventAggregator) {
    _eventAggregator = eventAggregator;
    ...
}
...
Run Code Online (Sandbox Code Playgroud)

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

在我的ModuleInit班上,我会有这样的事情:

...
private IUnityContainer _container;

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

在我的MainViewModel班上,我也可以实现_eventAggregator = ServiceLocator,Current.GetInstance<IEventAggregator>();,但我从概念上并不真正理解我在做什么.该计划正常运作......

我真的很想了解ServiceLocator实际上在做什么,以及我应该做些什么来适当地使用我的容器注册一个类型.我没有定义类的实现IEventAggregator,那么ServiceLocator获取实例的位置是什么?然后我必须注册什么才能当我解决某些问题时,就像我一样ViewModel,它会创建一个新EventAggregator实例?

And*_*ers 5

EventAggregator:

Prism库有一个EventAggregator你可以使用的默认值.它位于Microsoft.Practices.Prism.Events如果您使用Prism <5.0或Microsoft.Practices.Prism.PubSubEvents如果您使用Prism> = 5.0

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

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

        //register your own stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

服务定位:

ServiceLocator是一个简单的静态包装,的接触当前实例IUnityContainer的决心.除非没有其他可能的方法(例如在静态构造函数中),否则你永远不应该使用ServiceLocator获取结果.此模式称为服务定位器模式,通常不受欢迎.

UnityContainer:

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

container.RegisterType<IEventAggregator, EventAggregator>();
Run Code Online (Sandbox Code Playgroud)

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

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

... , EventAggreagator>(new ContainerControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)

这指示容器每次请求时都重用相同的实例.当使用默认的生存期管理RegisterTypeTransientLifetimeManager其将指示容器每次都创建一个新的实例.

注意:如果您RegisterInstance在某个时候使用,请注意默认的lifetimeManager是ContainerControlledLifetimeManager,而不是瞬态.

进一步阅读:

我建议你阅读依赖注入控制反转,这正是你想要做的.也许是棱镜如何工作的教程.

干杯