コンストラクター インジェクションを使用すると、次のように依存関係がコンシューマーに注入されます (少なくとも、正しく理解できれば幸いです)。
public class SomeConsumer
{
private IDependency someDependency;
public SomeConsumer(IDependency someDependency)
{
if (someDependency != null)
{
this.someDependency = someDependency;
}
else
{
throw new ArgumentNullException("someDependency");
}
}
public void Baz()
{
someDependency.DoSomething();
}
(...)
}
IDependency に Null オブジェクト パターンを使用する場合、ガード句は必要ですか? それとも Null オブジェクトを注入するのは間違っていますか?
更新:明確にするために、次のようなクラスとインターフェイスがあると仮定しましょう。
public interface IDependency
{
void DoSomething();
}
public class NullDependency : IDependency
{
public void DoSomething()
{
//Do nothing...
}
}
public class RealDependency : IDependency
{
public void DoSomething()
{
Console.WriteLine("Did something");
}
}
public class Foo
{
public void Bar()
{
IDependency dependency = new NullDependency();
SomeConsumer sc = new SomeConsumer(dependency);
sc.Baz();
}
}
次に、SomeConsumer からガード句を安全に削除して、次のようにすることはできますか?
public class SomeConsumer
{
private IDependency someDependency;
public SomeConsumer(IDependency someDependency)
{
this.someDependency = someDependency;
}
public void Baz()
{
//if someDependency is a NullDependency, this does nothing
someDependency.DoSomething();
}
(...)
}
null
または、注入されないかどうか確信が持てないため、ガード句を使用する必要がありますか?