私の意見では、BとCが同じインターフェイスを実装している場合、これを行う正しい方法はfactory
を渡すことです。また、具体的なタイプに依存するのを避ける代わりに、インターフェースに依存しています。これらの2つを具体的に取得しなければならない場合は、それぞれのインターフェースを追加し、そのインターフェースに依存するか、工場に行く必要があります。
(より完全な例ためthis questionを参照してください)
public enum XTypes
{
A,B,C...
}
public interface IXFactory
{
IX GetX(XTypes xType);
}
public interface IX
{
void SomeMethod()
}
//And I'd do A as an abstract class and rename to XBase
public class A : IX
{
public void SomeMethod() {}
}
public class D
{
public D(IXFactory xFactory)
{
XFactory = xFactory;
}
public void SomeMethod()
{
var x1 = XFactory.GetX(XTypes.A);
var x2 = XFactory.GetX(XTypes.C);
}
public IXFactory XFactory { get; set; }
}
私は個人的には、以下の場合に工場を置いていないでしょう。
- 私は全体のための具体的な依存関係の実装が必要プログラムの人生。そのとき、ある日、私 - 私はそれらのすべて(ちょうど
IEnumerable<IDependency>
- に依存して、単一のコード全体でその依存関係の実装が(工場を追加するのは簡単ですがあることを依存のすべての実装を必要とし、実行
- また、
IX
自身が彼のキーが何であるかを宣言する(この場合はenum
)、その後、工場の実装は本当にきれいですがあると便利です)、私は追加します
が必要になる場合があります。
- Castle Windosr
(他のIOCコンテナでもそうです)TypedFactoryFacility
があります。これはITypedFactoryComponentSelector
を実装して操作することができます。その後、自分でも実装する必要はありません。
*代わりにenum
のあなたがIX<XRequestBase>
にIX
を変更することができ、その後TypedFactoryFacility
がマップされると、自動的に動作するオブジェクトを持つことになります場合は:)
クラスAは、抽象クラスまたはインタフェースですか? –
その抽象クラスはnyのケースですが、もしdiffres idがどちらの場合でも答えが大好きならば。 – Nahum
これはインターフェイスとして実装されていますので、多くの 'types 'があります – Sherlock