Bry*_*ant 2 c# wpf unity-container mvvm eventaggregator
我不明白我们如何注册一个IEventAggregator实例,所以我们可以将它注入一个实例ViewModel.
例:
我定义了我的MainViewModel:
...
private IEventAggregator _eventAggregator;
public MainViewModel(IEventAggregator eventAggregator) {
_eventAggregator = eventAggregator;
...
}
...
Run Code Online (Sandbox Code Playgroud)
然后,我需要以某种方式注册一个实现IEventAggregator我想要注入的类ViewModel.
在我的ModuleInit班上,我会有这样的事情:
...
private IUnityContainer _container;
public ModuleInit(IUnityContainer _container) {
_container = container;
}
...
public void Initialize() {
container.RegisterType<IEventAggregator, ___(something)___>();
...
}
Run Code Online (Sandbox Code Playgroud)
在我的MainViewModel班上,我也可以实现_eventAggregator = ServiceLocator,Current.GetInstance<IEventAggregator>();,但我从概念上并不真正理解我在做什么.该计划正常运作......
我真的很想了解ServiceLocator实际上在做什么,以及我应该做些什么来适当地使用我的容器注册一个类型.我没有定义类的实现IEventAggregator,那么ServiceLocator获取实例的位置是什么?然后我必须注册什么才能当我解决某些问题时,就像我一样ViewModel,它会创建一个新EventAggregator实例?
EventAggregator:
Prism库有一个EventAggregator你可以使用的默认值.它位于Microsoft.Practices.Prism.Events如果您使用Prism <5.0或Microsoft.Practices.Prism.PubSubEvents如果您使用Prism> = 5.0
此外,如果你使用UnityBootstrapperfrom UnityExtensions,我怀疑你也在使用模块,那么所有EventAggregator在prism中的内置服务(包括)都将为你注册:
class MyBootstrapper : UnityBootstrapper
{
protected override void ConfigureContainer()
{
// the base.ConfigureContainer setup all build in prism services
base.ConfigureContainer();
//register your own stuff
}
}
Run Code Online (Sandbox Code Playgroud)
服务定位:
本ServiceLocator是一个简单的静态包装,的接触当前实例IUnityContainer的决心.除非没有其他可能的方法(例如在静态构造函数中),否则你永远不应该使用ServiceLocator获取结果.此模式称为服务定位器模式,通常不受欢迎.
UnityContainer:
容器的工作是创建注册到特定接口的任何类的实例,监视它们的生命周期,并在指定时重用实例.所以当你注册时:
container.RegisterType<IEventAggregator, EventAggregator>();
Run Code Online (Sandbox Code Playgroud)
... EventAggregator当类构造函数具有类型的参数时,您只是指示容器返回实例IEventAggregator.
但是,如果您只希望注册类的单个实例,那么您需要指定生命周期管理器:ContainerControlledLifetimeManager,如下所示:
... , EventAggreagator>(new ContainerControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
这指示容器每次请求时都重用相同的实例.当使用默认的生存期管理RegisterType是TransientLifetimeManager其将指示容器每次都创建一个新的实例.
注意:如果您RegisterInstance在某个时候使用,请注意默认的lifetimeManager是ContainerControlledLifetimeManager,而不是瞬态.
进一步阅读:
我建议你阅读依赖注入和控制反转,这正是你想要做的.也许是棱镜如何工作的教程.
干杯
| 归档时间: |
|
| 查看次数: |
2999 次 |
| 最近记录: |