混凝土.Net类的依赖注入

时间:2015-06-15 06:29:12

标签: c# .net dependency-injection ninject

注入/隔离密封在dll中并且不实现接口的类的首选方法是什么?

我们使用Ninject。

假设我们有一个“服务器”类,我们想要注入/隔离“服务器”使用的类TcpServer。

不要太具体,因为我想知道最好的方法,但让我们这样说:

public class Server 
{
    IServer _server;
    public Server(IServer server) 
    { 
        _server = server;
    }

    public void DoSomething()
    {
        _server.DoSomething();     
    }
}
应该注入

_server,比如TcpClient或模拟测试

1 个答案:

答案 0 :(得分:8)

如果TcpServer被密封并且没有实现接口,但您仍然希望将客户端与其特定实现分离,则必须定义客户端可以与之通信的接口,以及{{ 3}}从TcpServer到新界面。

从具体类中提取接口可能很诱人,但不要这样做。它在界面和具体类之间创建了一个语义耦合,你最希望最终打破Adapter

相反,请在中根据客户需要来定义界面。这来自Liskov Substitution Principle;作为Dependency Inversion Principle,第11章解释:“客户[...]拥有抽象接口”。 APPP最好。

因此,如果您的客户需要DoSomething方法,那么您只需添加到界面中:

public interface IServer
{
    void DoSomething();
}

您现在可以使用构造函数注入IServer注入客户端:

public class Client 
{
    private readonly IServer server;

    public Client(IServer server) 
    {
        if (server == null)
            throw new ArgumentNullException("server");

        this.server = server;
    }

    public void DoFoo()
    {
        this.server.DoSomething();     
    }
}

说到TcpServer,你可以在它上面创建一个适配器:

public class TcpServerAdapter : IServer
{
    private readonly TcpServer imp;

    public TcpServerAdapter(TcpServer imp)
    {
        if (imp == null)
            throw new ArgumentNullException("imp");

        this.imp = imp;
    }

    public void DoSomething()
    {
        this.imp.DoWhatever();
    }
}

请注意,这些方法不必具有相同的名称(甚至完全相同的签名),以便进行调整。