2011-09-15 10 views
6

Structure Mapは、コンテナまたはオブジェクトファクトリを使用して構成しますか?

私はこのような設定をしました:

var container = new Container(x => 
               { 
                x.For<IEngine>().Use<V6Engine>(); 
                x.For<ICar>().Use<HondaCar>(); 
               } 
); 

次に私のMVCコントローラのアクションで私はしました:

ICar car = ObjectFactory.GetInstance<ICar>(); 

何とかコンテナまたはObjectFactoryを使用してコンテナを設定する必要がありますか?それは解決されていないので、私はコンソールアプリケーションでは、#コンソールアプリケーションをテストし、それがうまくいきました:

ICar car = container.GetInstance<ICar>(); 

しかし、これは、コンテナがローカルスコープにあり、明らかに物事はglobal.asax.cs

で結ばれているので

答えて

0

にまで配線されているので、明らかに私は私は

Global.asaxの

ObjectFactory.Initialize(action => 
      { 
       action.For<ISomething>().Use<Something>; 
      }); 

次のように構成されていましたnはどこにでもあります。

ObjectFactory.GetInstance<ISomething>(); 

これは唯一の方法ではありません。また、あなたが探しているものは、

Scan(scanner => 
     { 
      scanner.AssemblyContainingType(....); 
      scanner.AddAllTypesOf(....); 
     } 
+3

btw:Objectfactoryから直接オブジェクトを引き出すのはアンチパターンです... –

+1

私は構造体のマップ自体にかなり新しい - 私は、ObjectFactory.GetInstanceを使用する場合は、パラメータを渡してIoCコンテナに作業をさせるよりも?私は悪いhabbitsを拾いたいと思うようにもう少しelabourateできますか? IService service = ObjectFactory.GetInstanceのような単純な呼び出しです。(); 2つの要素を強く結合していないのであれば問題ありませんか? – Glenit

3

です。ObjectFactoryは、コンテナのインスタンス用の静的ゲートウェイです。コンテナのインスタンスを1つしか必要とせず、単純な静的な方法で取得したい場合は、ObjectFactoryを使用します。 ObjectFactoryを初期化してから、ObjectFactoryを使用してインスタンスを取得する必要があります。

コンテナのライフタイムを自分で管理する場合は、コンテナのインスタンスを作成して、初期化式をコンストラクタに渡すことができます。次に、コンテナを格納するために宣言した変数からインスタンスを取得します。

あなたの例では、2つの方法を混在させていますが、これはうまくいきません。

関連する問題