我有几篇关于依赖注入的文章,我可以看到它的好处,特别是在单元测试方面。单位可以松散耦合,可以模拟依赖关系。
问题是 - 我只是不知道从哪里开始。
考虑下面的代码段(为了这篇文章的目的而编辑很多)我的代码。我正在从主窗体中实例化一个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;
}
}
答案 0 :(得分:1)
很难回答这么广泛的问题,但是你在哪里/谁创建连接对象的具体问题更简单。
您可以传入一个工厂对象,该对象知道如何创建连接对象以及代替模式。这样,如果要创建不同的(例如模拟)连接,只需传入一个不同的工厂对象,当要求创建连接时,该对象会创建不同的连接实现。
这有帮助,还是我错过了真正的问题?
答案 1 :(得分:0)
我会做什么。
依赖注入是你在应用S.O.L.I.D原则时迟早会遇到的事情,所以不要直接进入行动,而是花时间阅读这篇优秀的pdf。
然后结帐。
http://structuremap.net/structuremap/
例如。
这是我生命中最好的一次,希望对你来说这将是一次令人兴奋的经历。