我有几篇有关依赖注入的文章,我可以看到其中的好处,尤其是在单元测试方面。我可以松散地耦合这些单元,并且可以模拟依赖关系。
问题是-我只是不知道从哪里开始。
考虑下面我拥有的代码段(为此目的而对其进行了很多编辑)。我正在从主窗体中实例化一个Plc对象,并通过Connect方法以通信模式传递。
以目前的形式,它变得很难测试,因为我无法将Plc与CommsChannel隔离开来对其进行单元测试。 (我可以吗?)
该类依赖于使用CommsChannel对象,但是我只传递了一种用于在Plc自身内部创建此通道的模式。要使用依赖注入,我应该真正将已经创建的CommsChannel(也许通过“ ICommsChannel”接口)传递给Connect方法,或者通过Plc构造函数。那正确吗?
但这意味着首先要在我的主表单中创建CommsChannel,但这似乎也不对,因为感觉一切都将回到主表单的基础层,即一切开始。某种程度上,感觉就像我错过了难题的关键部分。
你从哪里开始?您必须在某处创建某个实例,但是我一直在努力理解应该在哪里。
public class Plc()
{
public bool Connect(CommsMode commsMode)
{
bool success = false;
// Create new comms channel.
this._commsChannel = this.GetCommsChannel(commsMode);
// Attempt connection
success = this._commsChannel.Connect();
return this._connected;
}
private CommsChannel GetCommsChannel(CommsMode mode)
{
CommsChannel channel;
switch (mode)
{
case CommsMode.RS232:
channel = new SerialCommsChannel(
SerialCommsSettings.Default.ComPort,
SerialCommsSettings.Default.BaudRate,
SerialCommsSettings.Default.DataBits,
SerialCommsSettings.Default.Parity,
SerialCommsSettings.Default.StopBits);
break;
case CommsMode.Tcp:
channel = new TcpCommsChannel(
TCPCommsSettings.Default.IP_Address,
TCPCommsSettings.Default.Port);
break;
default:
// Throw unknown comms channel exception.
}
return channel;
}
}
最佳答案
很难回答如此广泛的问题,但是您在哪里/由谁创建连接对象的特定问题就更简单了。
您可以传入一个工厂对象,该对象知道如何创建连接对象以及如何代替连接模式。这样,如果您要创建不同的(例如,模拟)连接,则只需传入一个不同的工厂对象,该对象会在被要求创建连接时创建一个不同的连接实现。
这有帮助吗,还是我错过了真正的问题?