C# 如何获取当前的温莎城堡集装箱?

C# 如何获取当前的温莎城堡集装箱?,c#,castle-windsor,C#,Castle Windsor,我是一个城堡温莎诺布。我有一个网络表单项目,这是一个热混乱。我正在尝试解决一个依赖项以测试用户注册。如何到达当前的WindsorContainer IWindsorContainer container = ???; IRegistrationLogic registrationLogic = container.Resolve<IRegistrationLogic>(); _registrationLogic.Register(); IWindsorContainer=???;

我是一个城堡温莎诺布。我有一个网络表单项目,这是一个热混乱。我正在尝试解决一个依赖项以测试用户注册。如何到达当前的WindsorContainer

IWindsorContainer container = ???;
IRegistrationLogic registrationLogic = container.Resolve<IRegistrationLogic>();
_registrationLogic.Register();
IWindsorContainer=???;
IRegistrationLogic registrationLogic=container.Resolve();
_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
}
公共类WindsorConfigTask:ICastleBootstrapperTask
{
public void Execute()
{
Container.AddFacility();
集装箱。登记(
用于()的组件
阿克塔斯先生(
新的DefaultClientModel
{
端点=
WcfEndpoint.ForContract().FromConfiguration(“surveyClient2”)
}
),
用于()的组件
阿克塔斯先生(
新的DefaultClientModel
{
端点=
WcfEndpoint.ForContract().FromConfiguration(
“本地成员身份客户端”)
})
);
Container.Register(Component.For())
.由()实施
.生活方式.Is(生活方式类型));
}
公共IWindsorContainer容器{get;set;}
#区域ICastleBootstrapperTask成员
public Castle.Core.Lifestyle类型Lifestyle类型
{
得到;
设置
}
#端区
}

有很多方法可以解决这个问题,但我认为最常见的方法是创建一个单例帮助器类来保存引用。请记住,您希望应用程序使用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以便稍后注入。我强烈反对直接使用容器。就像你上面的代码一样。。。完成后,您是否发布了一个版本???

温莎有一个用于此目的的界面。它被称为。实现它的最佳位置是
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;

这和我建议的一样,但并不明显需要创建容器的静态。静态实际上是关键,而不是接口所建议的属性。我不是,因为这里定义得很好,什么时候创建容器,什么时候清理容器。你的解决办法会带来一些麻烦。我真的很喜欢你的答案。向上投票。万一有人不知道如何在MVC中执行此操作,
var containerAccessor
应该等于
HttpContext.Current.ApplicationInstance作为IContainerAccessor在MVC中,您有许多拦截点,可以实现更干净的IoC容器集成。请参阅了解以下信息:WebApi与MVC:Global.asax具有相同的入口点,您可以通过相同的方式获得它:HttpContext.Current.ApplicationInstance作为IContainerAccessor。谢谢@YiannisP。