UnityContainer.Resolve或ServiceLocator.GetInstance?

这似乎是一个愚蠢的问题,因为在我的代码中一切正常,但我用我的Unity容器_ambientContainer以这种方式注册了单例:

  _ambientContainer.RegisterType(new ContainerControlledLifetimeManager()); 

为了避免使用我的本地字段,我使用:

 get { return ServiceLocator.Current.GetInstance(); } 

在我的get属性中获取我的对象的实例。 这样我总是得到相同的实例( Application.StateContext仍然是单例)或者GetInstance创建了一个新实例?

是否更好地使用本地_ambientContainer字段?

 get { return _ambientContainer.Resolve(); } 

谢谢。

我假设ServiceLocator类型来自CommonServiceLocator项目,并且您正在使用Unity适配器,在这种情况下GetInstance调用container.Resolve ,因此两行都是等效的。

你可以在这里查看来源 – http://commonservicelocator.codeplex.com/wikipage?title=Unity%20Adapter&referringTitle=Home

将容器的实例传递给消费者类通常不是一个好主意,因为您不再保证在您的应用程序中有一个位置可以注册组件和服务(称为组合根 )。

类应该在它们的公共API中声明它们的依赖关系,理想情况是通过将它们指定为构造函数参数 ,容器将在被要求解析特定类型时自动提供实例(称为自动assembly的过程)。

dependency injection通常是首选,但并不总是适用。 在使用服务定位器的情况下,就像您在示例中所做的那样,是将类与其依赖关系分离的下一个最佳解决方案。

总之,如果dependency injection不是一个选项,我会避免让我的类直接引用容器,而是让它们通过服务定位器访问它。

最好避免两种方式(ab)使用容器。

ServiceLocator被认为是现代应用程序架构中的反模式 。