Skip to main content
 首页 » 编程设计

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

2024年09月07日24cmt

我不明白我们如何注册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)控制反转,这正是您想要做的。也许还有棱镜如何工作的教程。

干杯