SOLIDの原則によれば、クラスは他のクラスに依存することはできません。依存関係を注入する必要があります。それは簡単です:依存関係の逆転。オブジェクト作成
class Foo
{
public Foo(IBar bar)
{
this.bar = bar;
}
private IBar bar;
}
interface IBar
{
}
class Bar: IBar
{
}
しかし、私は私のFooクラスはIBARの背後に正確な実装を知らない、バーのを作成できるようにしたい場合は? (
- 「サービスロケータ」を使用して、解決を呼び出すオブジェクトの種類を注入し、ジェネリック
- を用いた反射
- を使用して: は、私はここ4つの解決策を考えることができ、それらのすべては、欠点を持っているように見えます) 方法。
- 分離ファクトリクラスを作成し、Fooの中にそれを注入する:
class Foo
{
public void DoSmth(IBarCreator barCreator)
{
var newBar = barCreator.CreateBar();
}
}
interface IBarCreator
{
IBar CreateBar();
}
class BarCreator : IBarCreator
{
public IBar CreateBar()
{
return new Bar();
}
}
最終場合は自然に感じますが、BarCreatorクラスがあまりにもlitleコードを持っています。 あなたはどのように考えていますか?どちらが最適ですか?
オプション4が正しい答えです。http://stackoverflow.com/questions/1943576/is-there-a-pattern-for-initializing-objects-created-via-a-di-container/1945023#1945023 –
しかし、なぜFooにIBarを作成させたいのですか? Leaky Abstractionsに注意してください。 –