依赖注入和显式接口实现

Tha*_*den 9 c# dependency-injection explicit-interface

在依赖注入方面有明确的实现接口的好处吗?

据我所知,接口可以显式或隐式实现:

interface IFoo
{
    void Bar();
}

//implicit implementation
class Foo1 : IFoo
{
    public void Bar(){}
}

//explicit implementation
class Foo2 : IFoo
{
    void IFoo.Bar(){}
}
Run Code Online (Sandbox Code Playgroud)

现在只能通过调用接口方法来调用显式实现,而可以直接在类的实例上调用隐式实现:

class Baz
{
    void Ba()
    {
        Foo1 foo1 = new Foo1();
        foo1.Bar();

        Foo2 foo2 = new Foo2();
        foo2.Bar();    //syntax error

        IFoo foo2_explicit = new Foo2();
        foo2_explicit.Bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,使用显式接口实现,不能意外地在具体类上调用方法,但必须调用接口方法.这是否会阻止紧密耦合的代码,这是DI的一个目的,还是我在这里咆哮错误的树?毕竟,不能意外地编写一个构造函数或方法来获取注入的具体类而不是接口:

class Baz
{
    void Ba(Foo2 foo)
    {
        foo.Bar(); //syntax error
    }

    void Bb(IFoo foo)
    {
        foo.Bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 8

通常,依赖注入的目的是解耦,您可以通过将抽象注入其客户端来实现:

public class Baz
{
    private readonly IFoo foo;

    public Baz(IFoo foo)
    {
        this.foo = foo;
    }

    // Members using this.foo go here...
}
Run Code Online (Sandbox Code Playgroud)

这确保了Baz依赖于IFoo并且任何具体实现分离.

具体类是否IFoo隐式或显式实现没有区别.

偶尔,一个班级可能有一个具体的依赖,但这不是特别正常; 当它发生时,具体依赖是具体的,因此通常根本不会实现接口.在这种情况下,显式与隐式接口实现无关紧要.