以正确的方式使用依赖注射

Kam*_*yar 3 dependency-injection ioc-container inversion-of-control autofac

我正在使用Autofac在我的解决方案中实现IoC,但我怀疑我是否做得对.这是场景:
我有一些Manager类都来自BaseManager类.该BaseManager有一个protected User CurrentUser领域.我正在尝试做的是解决CurrentUser使用Autofac.我编写了一个IUserProvider接口并实现了几个类(例如WebUserProviderWinformsUserProvider).
然后我在下面注册了我的提供者(例如,在Global.asax):

builder.Register(c => new WebUserProvider(...)).As<IUserProvider>();  
Run Code Online (Sandbox Code Playgroud)
  • 如何解决依赖关系(container在我的类中访问)?我可以使用单例或服务定位器模式,但看起来它是反模式.那么我应该如何解决我的依赖?

ole*_*sii 5

这对我来说听起来像是过度工程.为什么你有一个了解用户的基础经理类?有一些经理类是一个代码气味和维护危险本身,因为你抽象太多.你真的需要吗?

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

您不应该寻找访问容器的方法.容器必须在一个地方初始化一次.您应该通过构造函数注入所有依赖项.container.Resolve<T>使用构造函数注入(或者某些人使用属性注入),使用依赖图中的其他位置和依赖图中的其他位置传递这些依赖项.

  • 如果这是一个WinForms应用程序,您可以在靠近入口点的地方创建和设置容器(主方法).在main中,您还可以解析接口并将其传递给成员.在ASP.NET中,您可以在global.asax中设置它,然后注册工厂,例如[here](http://stackoverflow.com/questions/5124393/setting-up-inversion-of-control-ioc -in-ASP净MVC-与-城堡温莎).因此,对于DI和IoC,所有依赖类都会注入抽象,并且从不明确请求. (2认同)