2011-06-10 9 views
2

私はコード内にfactoryクラスを持っていますが、Structermapへの呼び出しが嫌いです。私はこれをどのように正しい方法で行うべきですか?構造体のクラスとファクトリのクラス

class ManagerBaseFactory 
{ 
    public ManagerBase GetInstance(SomeEnum e) 
    { 
     Type t; 

     switch (e) 
     { 
      case SomeEnum.A: 
       t = typeof(Manager1); 
      case SomeEnum.B: 
       t = typeof(Manager2); 
      case SomeEnum.C: 
       t = typeof(Manager3); 
     } 
     return (ManagerBase)StructureMap.ObjectFactory.GetInstance(t); 
    } 
} 

答えて

2

このように構造マップを使用する際の問題はありません。現在のソリューションについて、あなたはどう思いますか?

ファクトリが不要な名前付きインスタンスを使用することもできます。 structuremap link

​​

あなたはよりちょうどあなたがに反対するものを一部明らかになっていない

SomeEnum e = SomeEnum.A; 
ObjectFactory.GetNamedInstance<ManagerBase>(e.ToString()); 
+0

ManagerBaseFactoryはテスト可能ではありません。私はメインのStructermapへのコールを1つだけ持っていきたいと思います。 – Hans

+0

私はこの構成のうまくいかないかどうかわかりません。プロセッサーはどのように見えますか? – Hans

+0

これは構造マニュアルから取った一例であり、プロセッサーは重要ではありません。このことは、ストラクチャマップを使用して、(あなたの車のマネージャーBase内の)オブジェクトの特定のインスタンスを、あなたの場合は列挙値にすることができる名前で取得することができます。私はそれが私の思う特定のニーズにマッチさせるように例を更新しました。 – llMll

0

を呼び出すことで、正しいものを取得することができます。あなたが作ることができる1つの改善はObjectFactoryスタティックゲートウェイの代わりにがコンストラクタに​​を取り込むことです。その後、ManagerBaseFactoryをコンテナから引き出すと、コンテナはそれ自身を工場に投入します。工場は、静的な依存関係なしで単体テストが容易になります。あなたはジェネリックを活用することができるように

ます。また、スイッチに直接return文を入れることができます:

case SomeEnum.A: 
    return _container.GetInstance<Manager1>(); 
+0

ManagerBaseFactoryはDIコンテナを使用しているため、テスト可能ではありません。 – Hans

+0

これは絶対にテスト可能です。だから、私はObjectFactoryを使うのではなく、IContainerを取り込むことを提案したのです。テストでは、Containerの新しいインスタンスを作成し、テストしているシナリオに必要な最小限の量でロードし、それをManagerBaseFactoryに渡します。またはIContainerをスタブアウトするだけです。 –

2

をあなたは絶対にあなたのManagerBaseFactoryがコンテナを使用しない場合、あなたはそれをすべてにアクセスを与えることができますコンテナからのManagerBase実装のうち、正しいものを返します。 StructureMapがコンストラクタ内の型のIEnumerableを見ると、それが知っているその型のすべてのインスタンスを注入します。

class ManagerBaseFactory 
{ 
    private readonly IEnumerable<ManagerBase> _managers; 

    public ManagerBaseFactory(IEnumerable<ManagerBase> managers) 
    { 
     _managers = managers; 
    } 

    public ManagerBase GetInstance(SomeEnum e) 
    { 
     Type t; 

     switch (e) 
     { 
      case SomeEnum.A: 
       t = typeof(Manager1); 
       break; 
      case SomeEnum.B: 
       t = typeof(Manager2); 
       break; 
      case SomeEnum.C: 
       t = typeof(Manager3); 
       break; 
      default: 
       return null; 
     } 
     return _managers.FirstOrDefault(m => m.GetType().Equals(t)); 
    } 
} 

そしてもちろん、あなたのManagerBase実装のすべてを確認する必要があるコンテナにロードされます

var container = new Container(x => 
{ 
    x.Scan(scan => 
    { 
     scan.TheCallingAssembly(); 
     scan.AddAllTypesOf<ManagerBase>(); 
    }); 
}); 
関連する問題