我有几篇有关依赖注入的文章,我可以看到其中的好处,尤其是在单元测试方面。我可以松散地耦合这些单元,并且可以模拟依赖关系。

问题是-我只是不知道从哪里开始。

考虑下面我拥有的代码段(为此目的而对其进行了很多编辑)。我正在从主窗体中实例化一个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;
    }
}

最佳答案

很难回答如此广泛的问题,但是您在哪里/由谁创建连接对象的特定问题就更简单了。

您可以传入一个工厂对象,该对象知道如何创建连接对象以及如何代替连接模式。这样,如果您要创建不同的(例如,模拟)连接,则只需传入一个不同的工厂对象,该对象会在被要求创建连接时创建一个不同的连接实现。

这有帮助吗,还是我错过了真正的问题?

08-06 19:01