gpt4 book ai didi

c# - 使用 EventAggregator 和 ViewModel 注册类型

转载 作者:行者123 更新时间:2023-12-03 08:44:54 28 4
gpt4 key购买 nike

我不明白我们如何注册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 中>

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

干杯

关于c# - 使用 EventAggregator 和 ViewModel 注册类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29814697/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com