3

我正在使用Autofac在我的解决方案中实现IoC,但我怀疑我是否正确地做对了。这里是场景:
我有一些Manager类,所有类都从BaseManager类派生。 BaseManager有一个protected User CurrentUser字段。我想要做的是使用Autofac解决CurrentUser。我写了一个IUserProvider接口并实现了几个类(例如WebUserProviderWinformsUserProvider)。
于是我注册了我的供应商如下(例如,在Global.asax)使用依赖注入正确的方法

builder.Register(c => new WebUserProvider(...)).As<IUserProvider>(); 
  • 我怎样才能解决依赖关系(访问container在我的课),我可以用一个单或服务定位器模式,但似乎?就像是一个anti-pattern,所以我应该怎么解决我的依赖?

回答

5

这听起来像是过度设计给我。为什么你会拥有基管理类具有这些用户的知识呢?哈ving 一些经理类别本身就是一种代码味道和维护风险,因为您的内容过于抽象。你真的需要吗?

如何解决依赖关系(在我的类中访问容器)?

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

+0

由于记录目的,我必须定义BaseManager并在那里初始化CurrentUser。 (我不希望将当前用户传递给我的经理类中的每个方法)。您说过“容器必须在一个地方初始化一次”,所以如果服务定位器和单例是反模式,那么还需要初始化和访问单个容器? – Kamyar 2012-03-06 08:43:26

+2

如果这是一个WinForms应用程序,您可以在接近输入点(主要方法)的地方创建和设置您的容器。在主体中,您还解析了一个接口并将其传递给成员。在ASP.NET中,你可以在global.asax中设置它,然后注册一个工厂,例如像[here](http://stackoverflow.com/questions/5124393/setting-up-inversion-of-control-ioc -in-ASP净MVC-与-城堡温莎)。因此,在DI和IoC中,所有相关类都被抽象并且从未被明确要求。 – oleksii 2012-03-06 08:59:50