gpt4 book ai didi

c# - 具体 .Net 类的依赖注入(inject)

转载 作者:太空宇宙 更新时间:2023-11-03 18:05:45 29 4
gpt4 key购买 nike

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

我们使用 Ninject。

假设我们有一个类“Server”,我们想要注入(inject)/隔离“Server”使用的类 TcpServer。

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

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

public void DoSomething()
{
_server.DoSomething();
}
}

_server 应该被注入(inject),比方说,TcpClient 或测试情况下的模拟

最佳答案

如果 TcpServer 是密封的并且没有实现任何接口(interface),但您仍然希望将客户端与其特定实现分离,则必须定义一个客户端可以与之通信的接口(interface),以及一个AdapterTcpServer 到新接口(interface)。

从具体类中提取接口(interface)可能很诱人,但不要这样做。它在接口(interface)和具体类之间创建了语义耦合,你很可能最终会破坏 Liskov Substitution Principle .

相反,根据客户的需求定义接口(interface)。这来自 Dependency Inversion Principle ;作为APPP ,第 11 章解释说:“客户端 [...] 拥有抽象接口(interface)”。 Role Interface最好。

因此,如果您的客户端需要一个DoSomething 方法,您只需添加到界面中即可:

public interface IServer
{
void DoSomething();
}

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

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();
}
}

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

关于c# - 具体 .Net 类的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30838596/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com