2017-06-03 5 views
1

私はコードをデカップリングしようとしています。代わりにシングルトンを使用するのではなく、私はインターフェイスで依存性注入を使いたいと思っています。ここまでは順調ですね。私が依存しているクラスのインターフェースに対して、すべてのタイプを汎用にする必要がありますか?

ここでは、このメソッドの引数または戻り値の型として他のネットワーククラスを使用する、この大きなネットワーククラスがあります。たとえば:

public class Network 
{ 
    void OnServerError(NetworkConnection conection, int errorCode); 
} 

public class NetworkConnection 
{ 
    public NetworkError lastError { get; } 
} 

public class NetworkError 
{ 
    public string Error { get; private set; } 
} 
  1. も、ネットワーククラスのためのインターフェイスを作成する意味がありますか?
  2. もしそうなら、すべてのタイプを一般化する必要がありますか?パブリックメソッドを持つクラスの型については、そのためのインタフェースも作成する必要がありますか?基本的には、すべてがインタフェースかジェネリック型のどちらかになるまで、クラスの中で深く進んでいきますか?
  3. このクラスのインターフェイスを作成したい理由の1つは、将来別のネットワークライブラリに切り替えることができ、私の初期インターフェイスには同じ署名が付いていても、どこでもすべてをリファクタリングしたくないということです私の既存のネットワーキングクラスのほとんどは、将来的にはリファクタリングする必要があります。私は何が欠けていますか?
+0

本当の質問は、あなたの 'Network'クラスが他のクラスにも注入されるかどうかです。もしそうなら、役に立つかもしれません。 Glennの答えが指摘するように、インターフェイスはDIでは必須ではなく、単なる便利なものです。本当の答えはあなた次第ですが、それはあなたの必要条件になります。あなたはコンストラクタやプロパティの注入のために行くのですか?どのコンテナを使用していますか? – Clint

答えて

0

Networkを依存性注入を利用するために必ずしもインターフェイスにする必要はありません。

私はこのプロジェクトに参加しているときに、クラスからインターフェイスを抽出する明確な理由がないときは、「テストシナリオでこのタイプのMock実装を作成したいと思っていますか?

一部のテストでは、特定のシナリオや動作をシミュレートすることができます。モックの実装は本当に便利です。

いくつかのクラスは意味がありますが、すべての場合にそうではありません。

希望すると便利です。

+0

ネットワーククラスについては、ユニットテストがネットワーク接続に依存せず、それが責任を負うものだけをテストしたいので、おそらくそれを嘲笑したいと思うでしょう。このような場合は、私はすべてをインターフェースする必要がありますか? – Renato

+0

インタフェースの抽出コストが低い(特にResharperを使用する場合)ため、多くの開発者がすべてのインタフェースを(ほとんどの場合)デフォルトにすることは珍しいことではありません。 – mjwills

関連する問題