在Mvc.Controller中使用Server
-
08-07-2019 - |
题
我有自己继承的 App.Controller
来自 Mvc.Controller
,然后我的所有控制器都继承自。我使用接口编写了一个提供程序,并将其实现为 MyService
,构造函数采用 Mvc.Controller
的 Server
属性,该代码是的HttpServerUtilityBase 代码>。
但是,我在 App.Controller
的构造函数中实例化 MyService
。问题是在构造 MyService
时,Controller的 Server
属性是 null
。我使用 public Controller():base(){}
来获取要构造的基础。但是, Server
仍为 null
。
如果可能,我想避免 Web.HttpContext.Current.Server
。
有没有人可以解决这个问题?
编辑:好吧,我已经实现了tvanfosson的建议,当我的app在属性 get
方法中构建 MyService
时, Server
仍为空。
编辑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
。
有你的问题。您需要传递 MyService
的实例,该实例已经构建到您的 App.Controller
的构造函数中。看看控制/依赖注入反转模式,看一下使这些模式变得容易的一些库(查看此列表)。
为什么需要服务器参考?你在做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.
}
这对我来说很好。
根据这个网站,如果你有这个控制器:
public class MyController : Controller
{
private string folderPath;
public MyController()
{
// Throws an error because Server is null
folderPath = Server.MapPath("~/uploads");
// Throws an error because this.ControllerContext is null
folderPath = this.ControllerContext.HttpContext.Server.MapPath("~/uploads");
}
}
然后你想用这种方式初始化它:
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
// now Server has been initialized
folderPath = Server.MapPath("~/uploads");
}