使用ASP.NET MVC3将请求ControllerContext注册到城堡windsor容器中的最佳方法是什么?最终,我希望能够说出
container.Resolve<ControllerContext>();
并返回请求控制器上下文。
我的绝大部分操作都是在向nservicebus发送消息以实际完成工作之前进行一些验证,身份验证等。为了避免必须在整个地方复制/粘贴这些20/30行代码,我将它们放入一个处理程序类中,我的控制器在构造函数中依赖它,然后操作调用此类,使我的操作只包含一个代码行。
构成处理程序的子类中的一个需要知道所采用的路由,我可以将控制器传递给处理程序,然后传递给这个类,但它看起来有点乱。如果有办法让Windsor注册为我提供它,那就太好了。
答案 0 :(得分:1)
我不认为你可以在没有一些非常丑陋的黑客的情况下注册ControllerContext,而恕我直言,无论如何这都不是一个好主意。 ControllerContext属于控制器,它并不意味着要共享。
但是,如果您只需要路由信息,可以像这样注册(UNTESTED!):
container.Register(Component.For<HttpContextBase>()
.UsingFactoryMethod(() => new HttpContextBaseWrapper(HttpContext.Current))
.LifeStyle.PerWebRequest,
Component.For<RouteData>()
.UsingFactoryMethod(k => RouteTable.Routes.GetRouteData(k.Resolve<HttpContextBase>()))
.LifeStyle.PerWebRequest);
另请参阅ASP.NET MVC & Windsor.Castle: working with HttpContext-dependent services了解详情。
我具体不知道你想要实现什么,但我会考虑使用过滤器或自定义ActionResults。
答案 1 :(得分:0)
对原始问题不是真正的答案,但我无法忍受可疑的架构动作:)对我而言,似乎ControllerContext不是最好的(好的,甚至不是一个好的)尝试扩展的地方。 ModelBinder和ActionAttributes是帮助重复代码的地方。他们可以自己进行模型映射,绑定和验证,从而使控制器免于承担这一责任。
通常,您真正想要做的是为控制器使用依赖注入本身注入有点 IAuthenticationService 和 IValidationService 的配置实例(具体实现它们)将包含所有那些20/30可重复使用的代码行)。然后在控制器中,您只需在一行代码中调用它们(甚至使用MVC3全局过滤器功能使其完全透明)。