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