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