C# 为什么IDependencyResolver与System.Web紧密耦合?

C# 为什么IDependencyResolver与System.Web紧密耦合?,c#,asp.net,.net,asp.net-mvc,asp.net-web-api,C#,Asp.net,.net,Asp.net Mvc,Asp.net Web Api,为什么idependencysolver与.NET framework中的System.Web程序集(Mvc或Http)耦合 DI系统的目标不是提供一种不可知的方式为客户提供依赖性服务?如果我想在一个项目中使用idependencysolver,而该项目不应引用任何与System.Web相关的内容,该怎么办 编辑: 这与其说是一个如何做的问题,不如说是一个哲学问题,因为我知道还有其他选择,比如开源DI库。接口IDependencyResolver是System.Web-Framework的扩展点

为什么
idependencysolver
与.NET framework中的
System.Web
程序集(Mvc或
Http
)耦合

DI系统的目标不是提供一种不可知的方式为客户提供依赖性服务?如果我想在一个项目中使用
idependencysolver
,而该项目不应引用任何与System.Web相关的内容,该怎么办

编辑:

这与其说是一个如何做的问题,不如说是一个哲学问题,因为我知道还有其他选择,比如开源DI库。

接口
IDependencyResolver
是System.Web-Framework的扩展点。这些框架依赖于这个接口来解析(控制器等的)实例及其依赖关系

框架有自己的接口实现,但是您可以提供自己的接口实现。内置实现的功能有限(外部配置、注入类型、拦截)

大多数IOC容器和DI框架都提供了此接口的实现,因此您可以将它们集成到现有框架中

DI系统的目标不是提供一种不可知的方式为客户提供依赖性服务

这是正确的,但在本例中,
idependencysolver
特定于定义它的库。该库的DI抽象允许不可知的扩展点来解析依赖关系。我相信这是抽象的最初目标

它并没有真正被其他库独立重用,很明显,和都有两个版本。尽管它们有相同的名称和目的,但它们的实现略有不同

它还演示了MarkSeemann在本文中提到的反模式,文章中还提到了上述抽象作为.NET一致性容器的已知示例。甚至我最喜欢的使用IServiceProvider的方法也在列表中列出

如果我想在一个应该 没有引用任何与System.Web相关的内容

我的建议是不要使用System.Web上的
idependencysolver
。我还想补充一点,最重要的是,应该特别注意遵循适当的设计模式,确保人们理解这些概念以及应该在哪里应用或避免它们

为什么IDependencyResolver与 NET框架中的System.Web程序集(Mvc或Http)

因为它是“他们”用来解析框架服务的接口。但是是的。。。至少,他们应该使用
System
命名空间中的
IServiceProvider

DI系统的目标并不是它应该提供一种不可知的操作方式 向客户提供依赖关系

没有。这不是这方面的目标。frameworkauthor的主要目标是让您扩展甚至替换framework正在使用的内部服务

在代码中,您应该在这些“标准”接口上引入自己的外观。它们是非常弱的抽象——对于基础来说很好,但与任何更丰富的解决或生命周期管理策略都相去甚远

如果我想在一个不应该使用IDependencyResolver的项目中使用IDependencyResolver,该怎么办 参考任何与System.Web相关的内容

您不能(不添加
System.Web
reference)也不应该这样做。在DI框架上使用您自己的内部抽象(Facade)。就像您不应该在类中直接使用
NLog.ILogger
一样,DI框架抽象也是如此

有些框架将使它接近或根本不可能做到,但您应该尽可能使用自己的外观

同样的规则也适用于更广泛的意义。 不要(不必要地)将项目附加到某些云服务,例如Azure。有一天,另一方的价格可能会好得多。尽可能地限制依赖项和粘性部分

编辑: 这更像是一个哲学问题,而不是关于如何做的要求, 因为我知道还有其他选择,比如开源DI库

哦。。。DI框架也有同样的建议。不要过度使用DI框架特性,这些特性可以在您的外观上以不同的方式轻松实现


注意:CI管道、服务总线/消息队列框架也是如此。

这是一个表示不紧密耦合的接口。您可以使用.net中提供的内置依赖项解析器,也可以通过实现
idependencysolver
接口编写自己的依赖项解析器。如果您使用的是castle Windsor或Unity或Ninject,它们已经有了自己版本的此解析器。系统中有IServiceProvider接口。然而,这是一个非常有限的界面优秀的答案,尽管如此,我仍然想知道为什么
IServiceProvider
没有在
系统中重用。Web
代替
IDependencyResolver
?这是该系统设计者的一个问题。但是,在下面的版本中,他们又回到了
IServiceProvider
,这就是我们今天在asp.net-core中的版本。这是为了消除困扰System.Web的紧密耦合。我建议阅读以下文章:@Nkosi我同意,有一个适当的组合根可以抵消缺点。不能使用特定的容器特性是一个缺点,应该仔细权衡,不要轻易更换容器。就我个人而言,我从来没有交换过一个容器。但我知道还有其他人不得不这么做。当然,问题是什么更昂贵:维护一个可能会被使用的抽象,还是咬b