在Mvc.Controller中使用Server

我有自己inheritance的来自Mvc.Controller ,然后我的所有控制器都inheritance自。 我使用接口编写了一个提供程序,并将其实现为MyService ,构造函数使用了HttpServerUtilityBaseMvc.ControllerServer属性。

但是,我在App.Controller的构造函数中实例化了MyService 。 问题是在构造MyService时Controller的Server属性为null 。 我使用了public Controller () : base() { }来获取要构造的基础。 但是, Server仍为null

我想尽可能避免使用Web.HttpContext.Current.Server

有没有人解决这个问题?

编辑:嗯,我已经实现了tvanfosson的建议,当我的app在属性get方法中构造MyService时, Server仍为null。

编辑2:没关系,我是个傻瓜。 我有另一个使用Server Controller ,并没有改变它。 案件结案。

使用延迟初始化来构建您的服务。

 private MyService service; public MyService Service { get { if (this.service == null) { this.service = new MyService(this.Server); } return this.service; } } 

然后,您的服务实际上不会实例化,直到它在控制器操作中使用,并且此时已设置Server属性。

我在App.Controller的构造函数中实例化MyService

这是你的问题。 您需要传递一个已经构建到App.Controller构造函数中的MyService实例。 看一下控制/dependency injection反转模式的反转,看一下使这些模式变得容易的一些库( 参见这个列表 )。

为什么需要服务器参考? 你在做url / html编码之类的东西吗? 如果是这样,你可以改用HttpUtility并完全摆脱上下文引用。

这是一个非常古老的问题,但主题仍然是相关的。 因此,2017年的一个暗示可能在2009年没有提供:

确实,在Controller构造函数Server为null。 但是您可以使用OnActionExecuting事件:

 protected override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); CurrentServer = Server; // CurrentServer is some instance variable I need later. } 

这对我来说很好。