2014-01-14 28 views
11

我是一個城堡溫莎諾布。我有一個WebForm項目,這是一個熱門的混亂。我正在嘗試解析依賴項來測試用戶註冊。我如何到達目前的WindsorContainer?我如何獲得當前的Castle Windsor容器?

IWindsorContainer container = ???; 
IRegistrationLogic registrationLogic = container.Resolve<IRegistrationLogic>(); 
_registrationLogic.Register(); 

這裏是我的引導程序:

public class WindsorConfigTask : ICastleBootstrapperTask 
{ 

    public void Execute() 
    { 
     Container.AddFacility<WcfFacility>(); 
     Container.Register(
      Component.For<IProcessMessageRequest>() 
       .ActAs(
        new DefaultClientModel 
        { 
         Endpoint = 
          WcfEndpoint.ForContract<IProcessMessageRequest>().FromConfiguration("surveyClient2") 
        } 
       ), 
      Component.For<ILocalMembershipService>() 
       .ActAs(
        new DefaultClientModel 
        { 
         Endpoint = 
          WcfEndpoint.ForContract<ILocalMembershipService>().FromConfiguration(
           "localMembershipClient") 
        }) 


      ); 

     Container.Register(Component.For<IRegistrationLogic>() 
      .ImplementedBy<RegistrationLogic>() 
      .LifeStyle.Is(LifeStyleType)); 
    } 

    public IWindsorContainer Container { get; set; } 


    #region ICastleBootstrapperTask Members 


    public Castle.Core.LifestyleType LifeStyleType 
    { 
     get; 
     set; 
    } 

    #endregion 
} 

回答

6

有很多方法來解決這個問題,但我認爲,最常見的是創建一個單獨的輔助類來保存引用。請記住,您想要使用DI自動從容器中獲取所有內容。也許只有幾個來自應用程序的電話將是容器。看看溫莎的控制器工廠。

事情是這樣的......

public static class ContainerManager 
{ 
    public static IWindsorContainer Container = null; 
} 

現在我已經知道採取這一步,你可以包括一些公用事業與獲得...

public static class ContainerManager 
    { 
     private static IWindsorContainer _container = null; 
     public static IWindsorContainer Container 
     { 
      get { 
       if (_container == null) { 
         // run installers, set _container = new container 
       } 
       return _container; 
      } 

     } 
    } 

我也認識您可能會問如何從下游依賴對象獲取容器......您可以使用自己註冊容器。默認情況下,它將註冊IKernel,但您可以稍後註冊IWindsorContainer進行注入。我會極力阻止直接使用容器。正如你在上面的代碼中所做的那樣......當你完成後你會做一個發佈嗎?

16

Windsor中有一個接口用於此目的。它被稱爲IContainerAccessor。實現它最好的地方就是Global.asax文件:

public class WebApplication : HttpApplication, IContainerAccessor { 
    static IWindsorContainer container; 

    public IWindsorContainer Container { 
    get { return container; } 
    } 

    protected void Application_Start() { 
    var bootstrapper = new WindsorConfigTask(); 
    bootstrapper.Execute(); 
    container = bootstrapper.Container; 
    } 

    protected void Application_End() { 
    container.Dispose(); 
    } 
} 

在Web表單用法如下:

var containerAccessor = Context.ApplicationInstance as IContainerAccessor; 
var container = containerAccessor.Container; 
+0

那請問我認爲同樣的事情,但不是很明顯,你需要創建容器的靜態。靜態確實是關鍵,而不是界面所建議的屬性。 – CrazyDart

+0

我沒有,因爲這裏有明確的定義,當容器將被創建,並且它將被清理。您的解決方案可能會帶來一些麻煩。 –

+0

這很棒..所以我如何在WebAPI中訪問這個上下文? – ppumkin