我有自己继承的 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"); 
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top