在Mvc.Controller中使用Server
我有自己inheritance的来自Mvc.Controller
,然后我的所有控制器都inheritance自。 我使用接口编写了一个提供程序,并将其实现为MyService
,构造函数使用了HttpServerUtilityBase
的Mvc.Controller
的Server
属性。
但是,我在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. }
这对我来说很好。