Инъекция зависимости: я не понимаю, с чего начать! - PullRequest
3 голосов
/ 03 января 2011

У меня есть несколько статей о 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 ]

1 голос
/ 03 января 2011

Трудно ответить на такой широкий вопрос, но ваш конкретный вопрос о том, где / кто создает объект подключения, проще.

Вы можете передать фабричный объект, который знает, как создавать объекты соединения, а также или вместо режима. Таким образом, если вы хотите создать разные (например, фиктивные) соединения, вы просто передаете другой объект фабрики, который создает другую реализацию соединения, когда его просят создать.

Это помогает, или я пропустил настоящий вопрос?

0 голосов
/ 03 января 2011

Что бы я сделал.

Инъекции зависимостей - это то, с чем вы рано или поздно сталкиваетесь, применяя принципы SOLID, поэтому вместо того, чтобы прыгать прямо в действие, нужно некоторое время и прочитать этот превосходный 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/

Например.

Это была лучшая поездка моегожизнь, надеюсь, это будет для вас одинаково захватывающим опытом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...