使用 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,正如我记得的那样,它已经注册 IEventAggregator
到 EventAggregator
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。
进一步阅读:
我建议您阅读 依赖注入 和 控制反转 ,这正是您想要做的。也可能是棱镜工作原理的教程。
干杯
我不明白我们如何注册一个 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,正如我记得的那样,它已经注册 IEventAggregator
到 EventAggregator
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。
进一步阅读:
我建议您阅读 依赖注入 和 控制反转 ,这正是您想要做的。也可能是棱镜工作原理的教程。
干杯