2009-12-18 35 views
1

我的代碼是StructureMap單行爲不工作

public static class ContainerBootstrapper 
{ 
    public static void BootstrapStructureMap() 
    { 

     ObjectFactory.Initialize(x => x 
         .ForRequestedType<ValueHolder>() 
         .CacheBy(InstanceScope.Singleton) 
         .TheDefaultIsConcreteType<ValueHolder>()); 
    } 
} 

初始化代碼(它是一個窗口服務)

static class Program 
{ 
    static void Main() 
    { 

     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
      { 
      new AppServer() 
      }; 
     ServiceBase.Run(ServicesToRun); 

     ContainerBootstrapper.BootstrapStructureMap(); 

    } 
} 

然後我把這樣一個實例:

var valueHolder = ObjectFactory.GetInstance<ValueHolder>(); 

但我每次都會遇到一個不是以前使用過的新實例。

+0

你有沒有測試失敗的人可以運行驗證和修復? – 2009-12-18 12:56:34

回答

1

我可以做一些猜測,對StructureMap進行調用時不夠熟悉。您在main()方法中調用BootstrapStructureMap()時已經很晚了。在調用ServiceBase.Run()之前一定要調用它。

此外,請注意對象工廠的線程關聯。一個服務中的代碼在一個線程池線程上運行是常見的,這個線程與執行main()方法的線程不同。如果StructureMap將單例存儲在[ThreadStatic]成員中,則會爲每個線程獲取不同的實例。瀏覽StructureMap源代碼,這不太可能是原因。

+0

是的,你是對的!它被要求遲到!把它放在Run()調用之前後,我終於得到了一個單例實例! 你對'對象工廠的線程親和性要小心'是什麼意思?我來自webforms,所以我不太熟悉這種東西。 – user137348 2009-12-18 13:51:30

+0

忽略這一點,初始化順序顯然是你的問題。 – 2009-12-18 14:01:51

1

我有同樣的problem..i自己用的是工廠內的結構圖容器,也不能得到singelton工作!

For<IServiceD>().Singleton().Use<ServiceD>();

看來只有攜手合作,瞬時創建的對象,但不明確創建的對象。 (使用谷歌搜索「瞬時,結構圖」,你應該找到這個東西。)

這同樣適用於子容器:

private IContainer myParentContainer; 
private IContainer myIoc; 
... 
myIoc = myParentContainer.GetNestedContainer(); 

,拉出實例myIoc都那麼獨特,但只有這麼長因爲它們是瞬時創建..

我只是發現它具有迷惑短暫創建的對象和其他bojects區分,並圍繞此代碼。從現在起的十年內,沒有人會了解這種差異了。它需要比這更簡單。