3

我有自己的继承App.ControllerMvc.Controller然后我的所有控制器都继承自。我使用接口编写了一个提供程序并将其实现为MyService,并且构造函数采用其Server属性Mvc.ControllerHttpServerUtilityBase.

MyService但是,我在App.Controller的构造函数中实例化。问题是ServerController的属性是null在构造时MyService。我曾经public Controller () : base() { }得到要建造的基地。然而,Server依然null

如果可能的话,我想避免Web.HttpContext.Current.Server

有没有人解决这个问题?

编辑:嗯,我已经实现了 tvanfosson 的建议,当我的应用程序MyService在属性get方法中构造时,Server仍然为空。

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

4

5 回答 5

8

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

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

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

于 2009-03-11T02:22:27.670 回答
0

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

有你的问题。您需要将MyService已经构建的实例传递到您App.Controller的构造函数中。查看控制反转/依赖注入模式,并查看一些使这些模式变得简单的库(请参阅此列表)。

于 2009-03-11T02:10:09.727 回答
0

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

于 2009-03-11T02:30:01.240 回答
0

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

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

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{
    base.OnActionExecuting(filterContext);

    CurrentServer = Server; // CurrentServer is some instance variable I need later.
} 

这对我来说很好。

于 2017-04-24T09:27:17.197 回答
0

根据这个网站,如果你有这个控制器:

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"); 
}
于 2018-11-20T23:15:18.253 回答