2011-09-15 50 views
6

我做了我的配置是這樣的:StructureMap,使用容器或objectfactory進行配置?

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

然後在我的MVC控制器動作我做:

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

我應該設置使用容器或ObjectFactory的不知我的容器?它並沒有解決,所以我在C#控制檯應用程序測試的東西出來,它的工作,如果我做的:

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

但這僅適用於如果容器是在局部範圍內,並在web應用程序是不顯然,因爲東西都在的global.asax.cs有線了

回答

0

我有我的配置如下

Global.asax的

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

的在其他地方。

ObjectFactory.GetInstance<ISomething>(); 

雖然這可能不是唯一的方法。另外我想你可能要找的是

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

btw:從Objectfactory直接拖動對象是一種反模式... –

+1

嗨,我很新的結構映射自己 - 我認爲這只是一個反模式,如果你要在無參數構造函數中使用ObjectFactory.GetInstance比通過參數傳遞它並讓IoC容器完成這項工作?你能否詳細說明一下,因爲我不想撿到不好的食物。是簡單的調用,如IService服務= ObjectFactory.GetInstance ();如果沒有緊密耦合兩個元素,好嗎? – Glenit

3

ObjectFactory是一個容器實例的靜態網關。如果你只想要一個容器的一個實例,並且想要一個簡單的靜態方法來獲取它,請使用ObjectFactory。您必須初始化ObjectFactory,然後通過ObjectFactory檢索您的實例。

或者,如果您想自己管理容器的生命週期,則可以創建一個Container實例,並將初始化表達式傳遞給構造函數。然後,您從您聲明存儲Container的變量中檢索實例。

在你的例子中,你正在混合兩種方法,這是行不通的。