依赖注入:我没有从哪里开始!

时间:2011-01-03 11:44:31

标签: c# winforms design-patterns dependency-injection

我有几篇关于依赖注入的文章,我可以看到它的好处,特别是在单元测试方面。单位可以松散耦合,可以模拟依赖关系。

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

考虑下面的代码段(为了这篇文章的目的而编辑很多)我的代码。我正在从主窗体中实例化一个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;
    }
}

2 个答案:

答案 0 :(得分:1)

很难回答这么广泛的问题,但是你在哪里/谁创建连接对象的具体问题更简单。

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

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

答案 1 :(得分:0)

我会做什么。

依赖注入是你在应用S.O.L.I.D原则时迟早会遇到的事情,所以不要直接进入行动,而是花时间阅读这篇优秀的pdf。

http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx

然后结帐。

http://structuremap.net/structuremap/

例如。

这是我生命中最好的一次,希望对你来说这将是一次令人兴奋的经历。