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被认为是现代应用程序架构中的反模式 。