依赖注入(DI)依赖于接口吗?

Pre*_*zel 3 c# dependency-injection separation-of-concerns

对大多数人来说这似乎是显而易见的,但我只是想确认依赖注入(DI)依赖于接口的使用.

更具体地说,对于在其构造函数中具有某个接口作为参数的类或者定义为属性(也称为Setter)的某个接口的情况,DI框架可以移交具体类的实例以满足需要该类中的接口.(如果这个描述不清楚,请道歉.我无法正确描述这一点,因为术语/概念对我来说仍然有点新鲜.)

我问的原因是我目前有一个具有各种依赖性的类.不是对象依赖,而是URL.这个类看起来像这个[C#]:

using System.Web.Services.Protocols;
public partial class SomeLibraryService : SoapHttpClientProtocol 
{
        public SomeLibraryService() 
        {
            this.Url = "http://MyDomainName.com:8080/library-service/jse";
        }
}
Run Code Online (Sandbox Code Playgroud)

SoapHttpClientProtocol类有一个名为的Public属性Url(它是一个普通的旧"字符串"),这里的构造函数将其初始化为硬编码值.

我可以使用DI框架在构造中注入不同的值吗?我想的不是因为this.Url不是任何一种Interface; 这是一个String.

[顺便提一下,根据我正在使用的代码中的注释,上面的代码是"由wsdl自动生成的".所以我并不特别想改变这段代码,尽管我也没有看到自己重新生成它.所以可能更改此代码很好.]

我可以看到自己制作了一个替代构造函数,它将一个字符串作为参数并以this.Url这种方式初始化,但我不确定这是关于保持松散耦合的关注点分离的正确方法.(SoC)的

对这种情况有什么建议吗?

Dav*_*vid 8

DI实际上只是意味着一个类不会构造它的外部依赖项,并且不会管理这些依赖项的生命周期.可以通过构造函数或方法参数注入依赖项.接口或抽象类型通常用于阐明消费者期望的依赖关系,但在某些情况下也可以注入简单类型.

例如,库中的类可能在内部调用HttpContext.Current,这会对代码将托管的应用程序进行任意假设.库方法的DI版本期望通过参数等注入HttpContext实例.


Jam*_*ran 5

它不需要使用接口 - 您可以使用具体类型或抽象基类.但是,当使用接口时,DI的许多优点(例如能够改变依赖的实现)都会出现.

Castle Windsor(我最了解的DI框架)允许您将IoC容器中的对象映射到接口,或者只是名称,这可以在您的情况下工作.