我不明白我们如何注册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 中>
另外,如果您使用来自UnityExtensions
的UnityBootstrapper
,我怀疑这是因为您也在使用模块,那么所有构建的服务(包括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)和控制反转,这正是您想要做的。也许还有棱镜如何工作的教程。
干杯