C# UnityContainer.Resolve还是ServiceLocator.GetInstance?

C# UnityContainer.Resolve还是ServiceLocator.GetInstance?,c#,dependency-injection,inversion-of-control,unity-container,C#,Dependency Injection,Inversion Of Control,Unity Container,这似乎是一个愚蠢的问题,因为在我的代码中,一切都正常工作,但我已经用我的Unity容器\u ambientContainer: _ambientContainer.RegisterType<Application.StateContext>(new ContainerControlledLifetimeManager()); 谢谢。我假设ServiceLocator类型来自项目,并且您使用的是Unity适配器,在这种情况下GetInstance调用容器。解析,因此这两行是等效的

这似乎是一个愚蠢的问题,因为在我的代码中,一切都正常工作,但我已经用我的Unity容器
\u ambientContainer
:

 _ambientContainer.RegisterType<Application.StateContext>(new ContainerControlledLifetimeManager());

谢谢。

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


您可以在此处查看源代码-

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


在现代应用程序体系结构中,

将容器实例传递给使用者类通常不是一个好主意,因为不再保证在应用程序中有一个注册组件和服务的地方(称为容器)

类应该在它们的公共API中声明它们的依赖关系,理想情况下,容器将在被要求解析特定类型时自动提供一个实例(一个称为自动关联的过程)

通常是,但并不总是适用。在这些情况下,使用a(就像您在示例中所做的那样)是下一个最佳的解决方案


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

您有其他选择的建议吗?(特定于问题中的示例代码?@Adam什么代码的替代方案?干将?或者注册
应用程序.StateContext
?作者没有告诉你他使用什么类型的应用程序(asp.net/mcv、winforms、wpf、console、wcf…),所以我不能告诉你要输入注册码。每种类型的应用程序都有不同的功能。至于对服务定位器的调用:将
StateContext
作为需要它的类的参数。这使得依赖关系明确且可互换(例如,对于测试)。如果您使用错误的方式,任何模式都是反模式。所有DI库都在封面下使用服务位置,否则它们将无法工作。不要相信你在网上看到的一切!是的,在某些时候,我们必须调用一个实际的实现类来接收一个类型的实例。坦率地说,为什么微软不将其放入System.Activator.CreateInstance???我是说,见鬼,我们都错过了一个盲目简单的解决方案吗?????
get {
    return ServiceLocator.Current.GetInstance<Application.StateContext>();
}
get {
    return _ambientContainer.Resolve<Application.StateContext>();
}