簡體   English   中英

我如何獲得目前的Castle Windsor容器?

[英]How do I get the current Castle Windsor container?

我是Castle Winsor Noob。 我有一個WebForm項目是一個熱點。 我正在嘗試解決依賴項以測試用戶注冊。 我如何到達目前的WindsorContainer?

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

這是我的Bootstrapper:

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
}

為此目的,溫莎有接口。 它被稱為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();
  }
}

您的網絡表單中的用法如下:

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

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

像這樣......

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

現在我已經知道它會更進一步,你可以包含一些實用工具和get ...

    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進行注入。 我強烈反對直接使用容器。 就像你上面的代碼一樣......你完成后會做一個發布嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM