Interface DI中的接口注入章节

Interface DI中的接口注入章节,interface,dependency-injection,Interface,Dependency Injection,我刚刚开始学习什么是依赖注入和反转控制。但我不能得到一件事。只有当我定义了一些接口来描述需要实现的方法时,接口注入才是唯一的。该方法获取某个类的实例作为参数,然后在类中实现接口的内容只是描述该方法的主体?接口只是定义类应该实现哪些公共成员的契约。它不控制实际的实现——您需要一个具体的类来实现这一点 // This is only a contract that defines what members // all concrete types must implement. public in

我刚刚开始学习什么是依赖注入和反转控制。但我不能得到一件事。只有当我定义了一些接口来描述需要实现的方法时,接口注入才是唯一的。该方法获取某个类的实例作为参数,然后在类中实现接口的内容只是描述该方法的主体?

接口只是定义类应该实现哪些公共成员的契约。它不控制实际的实现——您需要一个具体的类来实现这一点

// This is only a contract that defines what members
// all concrete types must implement.
public interface ISomeType
{
    void DoSomething();
}

// This class implements the interface. Therefore, it must
// have all of the methods the contract specifies. In some
// languages, this can be done implicitly just by adding the
// member, but it usually must be public.
public class SomeType : ISomeType
{
    public void DoSomething()
    {
        Console.WriteLine("Hello World");
    }
}
当您使一个类实现一个接口时,它隐式地意味着该类的实例可以转换为接口类型

ISomeType x = new SomeType();
依赖项注入利用了这种行为。通常在映射中同时定义接口类型和具体实现

container.For<ISomeType>().Use<SomeType>();
建议的方法是,在组成整个对象图时(在中),允许DI容器隐式执行此操作,但也可以显式执行此操作(这是一个更好的示例):

ISomeService=container.GetInstance();
假设容器被配置为将ISomeService映射到SomeService(就像我之前使用ISomeType展示的那样),这一行代码将创建SomeService的实例,并自动将SomeType的实例注入其构造函数

然而,很难从一个简单的例子中看出这一点。依赖项注入适用于具有多种类型的复杂应用程序。当应用程序复杂时,它会简化事情,但当应用程序简单时,它会使事情变得更复杂

public class SomeService : ISomeService
{
    private readonly ISomeType someType;

    public SomeService(ISomeType someType)
    {
        if (someType == null) throw new ArgumentNullException("someType");
        this.someType = someType;
    }
}
ISomeService = container.GetInstance<ISomeService>();