【发布时间】:2011-01-03 11:44:30
【问题描述】:
我有几篇关于依赖注入的文章,我可以看到它的好处,尤其是在单元测试方面。这些单元可以松散耦合,并且可以模拟依赖关系。
问题是 - 我只是不知道从哪里开始。
考虑一下我拥有的代码(为了这篇文章的目的而进行了很多编辑)下面的这个 sn-p。我正在从主窗体实例化一个 Plc 对象,并通过 Connect 方法传入通信模式。
目前的形式很难测试,因为我无法将 Plc 与 CommsChannel 隔离开来对其进行单元测试。 (可以吗?)
该类依赖于使用 CommsChannel 对象,但我只传递了一种用于在 Plc 本身内创建此通道的模式。要使用依赖注入,我真的应该将已经创建的 CommsChannel(可能通过“ICommsChannel”接口)传递给 Connect 方法,或者可能通过 Plc 构造函数。对吗?
但这意味着首先在我的主窗体中创建 CommsChannel,这似乎也不对,因为感觉一切都会回到主窗体的基础层,一切都从这里开始。不知何故,我感觉我错过了拼图中的关键部分。
你从哪里开始?您必须在 somewhere 创建某个东西的实例,但我很难理解它应该在哪里。
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;
}
}
【问题讨论】:
-
你在stackoverflow.com/tags/dependency-injection/info阅读了依赖注入标签介绍/FAQ
-
在哪里编写应用程序:stackoverflow.com/questions/1410719/…
-
@Mark:我没有看到那个常见问题解答,谢谢。
标签: c# winforms design-patterns dependency-injection