首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegisterType与EventAggregator和ViewModel

RegisterType与EventAggregator和ViewModel
EN

Stack Overflow用户
提问于 2015-04-23 05:45:31
回答 2查看 3.8K关注 0票数 2

我不明白如何注册IEventAggregator实例以便将它注入到ViewModel中。

示例:

我定义了我的MainViewModel

代码语言:javascript
复制
...
private IEventAggregator _eventAggregator;

public MainViewModel(IEventAggregator eventAggregator) {
    _eventAggregator = eventAggregator;
    ...
}
...

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

在我的ModuleInit类中,我会有这样的东西:

代码语言:javascript
复制
...
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实例?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-23 07:01:55

EventAggregator:

Prism库具有可以使用的默认EventAggregator。如果使用棱镜< 5.0,则位于Microsoft.Practices.Prism.Events中;如果使用棱镜>= 5.0,则位于Microsoft.Practices.Prism.PubSubEvents中。

此外,如果您使用来自UnityBootstrapperUnityExtensions(我怀疑您也在使用模块),那么所有在棱镜中构建的服务(包括EventAggregator)都将为您注册:

代码语言:javascript
复制
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:

容器的任务是创建注册到特定接口的任何类的实例,监视它们的生存期,并在指定的情况下重用实例。所以当你注册时:

代码语言:javascript
复制
container.RegisterType<IEventAggregator, EventAggregator>();

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

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

代码语言:javascript
复制
... , EventAggreagator>(new ContainerControlledLifetimeManager());

这将指示容器在每次请求时重用相同的实例。使用RegisterType时,默认的生存期管理器是TransientLifetimeManager,它将指示容器每次创建一个新实例。

注意:如果您在某个时候使用RegisterInstance,那么请注意默认的lifetimeManager是ContainerControlledLifetimeManager,而不是临时的。

进一步阅读:

我建议你阅读依赖注入和控制反转,这正是你想要做的。也可能是关于棱镜工作原理的教程。

干杯

票数 5
EN

Stack Overflow用户

发布于 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实例,因此它适合您。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29814697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档