具体 .Net 的依赖注入 类
Dependency Injection for concrete .Net classes
对于injecting/isolating class封装在dll中且不实现接口的es,首选方式是什么?
我们使用Ninject.
假设我们有一个 class "Server",我们想要 inject/isolate "Server" 使用的 class TcpServer。
不想太具体,因为我想知道最好的方法,但让我们这样说吧:
public class Server
{
IServer _server;
public Server(IServer server)
{
_server = server;
}
public void DoSomething()
{
_server.DoSomething();
}
}
_server
应该注入,比方说,TcpClient 或 mock 以防测试
如果 TcpServer
是密封的并且没有实现任何接口,但您仍然希望将客户端与其特定实现分离,则必须定义一个客户端可以与之通信的接口,以及一个Adapter 从 TcpServer
到新界面。
从具体 class 中提取接口可能很诱人,但不要这样做。它在界面和具体 class 之间创建了语义耦合,您很可能最终会破坏 Liskov Substitution Principle.
相反,根据客户需要定义接口。这遵循Dependency Inversion Principle; as APPP, chapter 11 explains: "clients [...] own the abstract interfaces". A Role Interface是最好的。
因此,如果您的客户需要 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();
}
}
请注意,方法不必具有相同的名称(甚至完全相同的签名)即可进行调整。
对于injecting/isolating class封装在dll中且不实现接口的es,首选方式是什么?
我们使用Ninject.
假设我们有一个 class "Server",我们想要 inject/isolate "Server" 使用的 class TcpServer。
不想太具体,因为我想知道最好的方法,但让我们这样说吧:
public class Server
{
IServer _server;
public Server(IServer server)
{
_server = server;
}
public void DoSomething()
{
_server.DoSomething();
}
}
_server
应该注入,比方说,TcpClient 或 mock 以防测试
如果 TcpServer
是密封的并且没有实现任何接口,但您仍然希望将客户端与其特定实现分离,则必须定义一个客户端可以与之通信的接口,以及一个Adapter 从 TcpServer
到新界面。
从具体 class 中提取接口可能很诱人,但不要这样做。它在界面和具体 class 之间创建了语义耦合,您很可能最终会破坏 Liskov Substitution Principle.
相反,根据客户需要定义接口。这遵循Dependency Inversion Principle; as APPP, chapter 11 explains: "clients [...] own the abstract interfaces". A Role Interface是最好的。
因此,如果您的客户需要 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();
}
}
请注意,方法不必具有相同的名称(甚至完全相同的签名)即可进行调整。