私はDependency Injectionに関するいくつかの記事を持っていますが、特に単体テストに関しては、その利点が分かります。ユニットは私と疎結合することができ、依存関係を嘲笑することができます。依存性注入:私はどこから始めなければならないのですか?
問題は - 私はちょうどどこから始めなければならないのですか?
私は持っている(この記事の目的のために多く編集された)コードの下でこのスニペットを検討してください。私は、メインフォームからPlcオブジェクトをインスタンス化し、Connectメソッドを介して通信モードで渡しています。
CommsChannelからPlcを単体テストに分離できないため、現状ではテストが難しくなります。 (できますか)
クラスはCommsChannelオブジェクトを使用するかどうかによって異なりますが、Plc内でこのチャネルを作成するためのモードでのみ渡しています。 Dependency Injectionを使うためには、既に作成された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;
}
}
関連:http://stackoverflow.com/questions/4570750/dependency-injection-turtles-all-the-way-down/4570814#4570814 –
依存性注入タグのイントロ/よくある質問はhttp: /stackoverflow.com/tags/dependency-injection/info –
アプリケーションを作成する場所:http:// stackoverflow。com/questions/1410719/design-where-should-using-objects-be-registered-when-using-windsor/1410738#1410738 –