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