2012-08-13 27 views
1

我在我的溫莎集裝箱有一些非常奇怪的行爲。溫莎短暫的生活方式

我已經像這樣配置了我的容器。

Container = new WindsorContainer(); 
Container.Kernel.ComponentModelCreated += KernelComponentModelCreated; 
Container.Install(FromAssembly.This()); 

private static void KernelComponentModelCreated(ComponentModel model) 
{ 
    if (model.LifestyleType == LifestyleType.Undefined) 
     model.LifestyleType = LifestyleType.Transient; 
} 

所以我假設我所有的組件,我不指定生活方式會得到一個短暫的生活方式,它似乎不給任何問題,到現在爲止。

我啓動了多個異步任務,它們都解析了一些組件。 (所以你會希望每個任務得到組件的新實例)

但是現在我知道任務不會獲得新的實例,因爲我的任務因組件串擾問題而失敗。 (所以它被用於多個任務)

當我替換Container.Resolve(somecomponent);只需創建新的組件,一切都可以正常工作。

var contextProvider = MvcApplication.Container.Resolve<IDbContextProvider>(); 

替換

var contextProvider = new DbContextProvider(); 

所以我的問題是什麼我在這裏失蹤。

由於顯式配置,任務在瞬態配置的MVC3控制器中啓動。

因爲上面的代碼,DbContextProvider在所有存儲庫中也被解析,這些存儲庫也是瞬態的。

我在文檔中發現的另一件事是。您必須釋放瞬態組件。我用IDisposable實現了所有組件。但由於在我的控制器中進行了自動構造器注入,我不能完全確定是否必須手動釋放它們,如果可以,我該怎麼做。 (是的,我知道我必須調用容器上的釋放方法)

更新下

代碼負責釋放和解決我的控制器:

public class WindsorControllerFactory : DefaultControllerFactory 
{ 
    private readonly IKernel _kernel; 

    public WindsorControllerFactory(IKernel kernel) 
    { 
     _kernel = kernel; 
    } 

    public override void ReleaseController(IController controller) 
    { 
     _kernel.ReleaseComponent(controller); 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
     { 
      throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", requestContext.HttpContext.Request.Path)); 
     } 
     return (IController)_kernel.Resolve(controllerType); 
    } 
} 

有一些例子供測試所有依賴關係是否已經解決並按照他們應該的方式發佈? (LifeStyle測試)

回答

1

我不確定這是否是造成您的問題的原因,但您應該僅在IContributeComponentModelConstruction的實施中修改ComponentModel

查看documentation of the component model construction contributors以獲取有關如何有效更改容器默認生活方式的幫助。

關於處置IDisposable秒 - 如果你釋放你的控制器應該像你一切都將只是溫莎工作:)

+0

好了,放開了自己的資源,就像我在我的WindsorControllerFactory還將發佈在我的控制器所有的依賴嗎?看到我的更新... – 2012-08-14 08:56:11

+1

是的 - 雖然,我想知道爲什麼你直接使用內核 - 你爲什麼不使用你的'WindsorContainer'? – mookid8000 2012-08-15 05:39:52