Dependency injection 正确使用依赖注入

Dependency injection 正确使用依赖注入,dependency-injection,inversion-of-control,ioc-container,autofac,Dependency Injection,Inversion Of Control,Ioc Container,Autofac,我正在使用Autofac在我的解决方案中实现IoC,但我怀疑我是否做对了。以下是场景: 我有一些Manager类,它们都来自BaseManager类。BaseManager有一个protectedusercurrentuser字段。我想做的是使用Autofac解析CurrentUser。我编写了一个IUserProvider接口,并实现了几个类(例如WebUserProvider和WinformsUserProvider)。 然后我注册了我的提供商,如下所示(例如,在Global.asax中):

我正在使用Autofac在我的解决方案中实现IoC,但我怀疑我是否做对了。以下是场景:
我有一些
Manager
类,它们都来自
BaseManager
类。
BaseManager
有一个
protectedusercurrentuser
字段。我想做的是使用Autofac解析
CurrentUser
。我编写了一个
IUserProvider
接口,并实现了几个类(例如
WebUserProvider
WinformsUserProvider
)。
然后我注册了我的提供商,如下所示(例如,在
Global.asax中)

builder.Register(c => new WebUserProvider(...)).As<IUserProvider>();  
builder.Register(c=>newwebuserprovider(…).As();
  • 我如何解决依赖关系(在我的类中访问
    容器
    )?我可以使用singleton或service locator模式,但它似乎是一种新的模式。那么,我应该如何解决我的依赖关系呢

    • 这听起来像是过度工程。为什么会有一个了解用户的基本管理器类?拥有几个管理器类本身就是一种代码气味和维护风险,因为您的抽象太多了。你真的需要吗

      如何解析依赖项(访问类中的容器)


      您不应该寻找访问容器的方法。容器必须在单个位置初始化一次。您应该通过构造函数注入所有依赖项。这些依赖项是使用
      容器从依赖关系图的根传入的。使用构造函数注入解析
      和依赖关系图中的其他地方(或者一些人使用属性注入)。

      出于日志记录的目的,我必须在那里定义BaseManager并初始化CurrentUser。(我不想把当前用户传递给我的管理器类中的每个方法。)你说“容器必须在一个地方初始化一次”,所以如果服务定位器和单例是反模式的,那么还有什么可以初始化和访问单个容器呢?如果这是WinForms应用程序,您可以在靠近入口点(main方法)的位置创建和设置容器。在main中,也可以解析接口并将其传递给成员。在ASP.NET中,您可以在global.asax中设置它,然后注册工厂,例如。因此,对于DI和IoC,所有依赖类都注入了它们的抽象,并且从未明确请求过。