【发布时间】:2011-06-30 22:16:48
【问题描述】:
经过多次踢腿和尖叫后,我开始接受 DI,尽管随着依赖项的增长,SL 看起来会变得更加清晰。
但是,IMO 在 DI 方面仍然存在重大问题:
当您无法控制对象的实例化时,DI 是不可能的。在 ASP.NET 世界中,示例包括:HttpModule、HttpHandler、Page 等。
在上述场景中,我们将求助于静态服务位置来解决依赖关系,通常通过HttpContext.Current,它总是从当前线程推断范围。因此,如果我们要在这里使用静态 SL,那么为什么不在其他地方也使用它呢?
答案是否很简单:咬紧牙关,必要时使用 SL(如上),但尝试支持 DI?如果是这样:是否只使用一次静态 SL 可能会破坏整个应用程序的一致性?从本质上消除 DI 在其他地方的辛勤工作?
【问题讨论】:
-
为什么会有静态 SL?
-
@Phill:接口是静态的,尽管返回的实际实例可能仅限于特定上下文。例如: HttpContext.Current 是一个静态方法,虽然反映它会表明它实际上推断从当前线程返回哪个 HttpContext 实例。然而,静态是静态的,不管底层工厂逻辑有多“聪明”;它仍然存在根本缺陷,因为必须将单个工厂存储在全局/应用程序状态中。
-
无论如何,HttpContext 不应该是你的 SL 的一部分,HttpContext 是框架的一部分,我不明白 HttpContext.Current 是静态的对你的 SL 是否是静态的有什么影响。
-
相关性在于它是 only 可用于 HttpModules(和其他)的对象,可用于推断当前范围。我们不能注入模块,因为它们是由 ASP.NET 运行时实例化的;因此,要引用由另一个组件创建的对象,我们将不得不使用类似 HttpContext.Current.Items["MyDependency"] 的东西,或者更糟糕的是,使用静态变量 MyDependency.Instance。
-
开始写单元测试你很快就会发现SL很痛苦。
标签: c# asp.net dependency-injection dependency-management service-locator