C# プロジェクトで依存性注入を使用していますが、通常はすべて問題ありません。それにもかかわらず、「コンストラクターは単純な操作のみで構成する必要があります-依存関係を割り当てて、それ以上何もしない」というルールをよく耳にします。
//dependencies
interface IMyFooDependency
{
string GetBuzz();
int DoOtherStuff();
}
interface IMyBarDependency
{
void CrunchMe();
}
//consumer
class MyNiceConsumer
{
private readonly IMyFooDependency foo;
private readonly IMyBarDependency bar;
private /*readonly*/ string buzz;//<---question here
MyNiceConsumer(IMyFooDependency foo, IMyBarDependency bar)
{
//omitting null checks
this.foo = foo;
this.bar = bar;
//OR
this.buzz = foo.GetBuzz();//is this a bad thing to do?
}
}
UPDIMyFooDependency
:を に置き換えることはできないと仮定しますGetBuzz()
。その場合、答えは明らかです:「依存しないでくださいfoo
」。
UPD2 : この質問は、仮想コードで foo から依存関係を排除することではなく、優れたコンストラクター設計の原則を理解することに関するものであることを理解してください。
したがって、私の質問は次のとおりです。これは、コンストラクターに重要なロジックを含めるのは本当に悪いパターンbuzz
ですか (つまり、値を取得し、依存関係に基づいていくつかの計算を行います)。
個人的には、遅延読み込みが必要でない限り、foo.GetBuzz()
オブジェクトはコンストラクターへの呼び出し後に初期化する必要があるため、コンストラクターに含めます。
私が見る唯一の欠点: 重要なロジックを含めることで、何か問題が発生する可能性のある場所の数が増え、IoC コンテナーから難読化されたエラー メッセージが表示されます (ただし、無効なパラメーターの場合も同じことが起こるため、欠点はかなり小さいです)
重要なコンストラクターを省略するためのその他の考慮事項はありますか?