gpt4 book ai didi

c# - 依赖注入(inject) : I don't get where to start!

转载 作者:行者123 更新时间:2023-11-30 18:06:41 29 4
gpt4 key购买 nike

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

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

考虑下面的这段代码(为了这篇文章的目的进行了大量编辑)我拥有的代码。我正在从主窗体实例化一个 Plc 对象,并通过 Connect 方法传入通信模式。

以目前的形式,它变得难以测试,因为我无法将 Plc 与 CommsChannel 隔离开来对其进行单元测试。 (我可以吗?)

该类依赖于使用 CommsChannel 对象,但我只传递用于在 Plc 本身内创建此 channel 的模式。要使用依赖注入(inject),我真的应该将已经创建的 CommsChannel(可能通过“ICommsChannel”接口(interface))传递给 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;
}
}

最佳答案

很难回答如此宽泛的问题,但您关于在哪里/谁创建连接对象的具体问题更简单。

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

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

关于c# - 依赖注入(inject) : I don't get where to start!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4584142/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com