我不明白如何注册IEventAggregator实例以便将它注入到ViewModel中。
示例:
我定义了我的MainViewModel
...
private IEventAggregator _eventAggregator;
public MainViewModel(IEventAggregator eventAggregator) {
_eventAggregator = eventAggregator;
...
}
...然后,我需要以某种方式注册一个实现IEventAggregator的类,我想在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实例?
发布于 2015-04-23 07:01:55
EventAggregator:
Prism库具有可以使用的默认EventAggregator。如果使用棱镜< 5.0,则位于Microsoft.Practices.Prism.Events中;如果使用棱镜>= 5.0,则位于Microsoft.Practices.Prism.PubSubEvents中。
此外,如果您使用来自UnityBootstrapper的UnityExtensions(我怀疑您也在使用模块),那么所有在棱镜中构建的服务(包括EventAggregator)都将为您注册:
class MyBootstrapper : UnityBootstrapper
{
protected override void ConfigureContainer()
{
// the base.ConfigureContainer setup all build in prism services
base.ConfigureContainer();
//register your own stuff
}
}ServiceLocator:
ServiceLocator只是一个静态包装器,它联系IUnityContainer的当前实例以进行解析。除非没有其他可能的方法(例如,在静态构造函数中),否则永远不会使用ServiceLocator来获取解析。这种模式被称为服务定位器模式,通常不被欣赏。
UnityContainer:
容器的任务是创建注册到特定接口的任何类的实例,监视它们的生存期,并在指定的情况下重用实例。所以当你注册时:
container.RegisterType<IEventAggregator, EventAggregator>();...you只是指示容器返回一个EventAggregator实例,当类构造函数具有一个类型为IEventAggregator的参数时。
但是,如果只希望注册类的单个实例,则需要指定生存期管理器:ContainerControlledLifetimeManager,如下所示:
... , EventAggreagator>(new ContainerControlledLifetimeManager());这将指示容器在每次请求时重用相同的实例。使用RegisterType时,默认的生存期管理器是TransientLifetimeManager,它将指示容器每次创建一个新实例。
注意:如果您在某个时候使用RegisterInstance,那么请注意默认的lifetimeManager是ContainerControlledLifetimeManager,而不是临时的。
进一步阅读:
我建议你阅读依赖注入和控制反转,这正是你想要做的。也可能是关于棱镜工作原理的教程。
干杯
发布于 2015-04-23 06:43:22
Microsoft框架有Microsoft.Practices.Prism.Events.EventAggregator类,它实现了IEventAggregator。假设您已经通过扩展BootStrapper来实现您的UnityBootstrapper,正如我记得的那样,UnityBootstrapper已经将IEventAggregator注册到了EventAggregator类,因此您不需要再次这样做。使用IEventAggregator解析UnityContainer将为您提供EventAggregator单实例。
您的ServiceLocator内部正在调用container.Resolve以获取EventAggregator实例,因此它适合您。
https://stackoverflow.com/questions/29814697
复制相似问题