Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Mvc.Controller中使用服务器_C#_Asp.net Mvc_Controller - Fatal编程技术网

C# 在Mvc.Controller中使用服务器

C# 在Mvc.Controller中使用服务器,c#,asp.net-mvc,controller,C#,Asp.net Mvc,Controller,我从Mvc.Controller继承了自己的App.Controller,然后我的所有控制器都从中继承。我使用接口编写了一个提供者,并将其实现为MyService,构造函数使用Mvc.Controller的Server属性,该属性属于HttpServerUtilityBase 但是,我在App.Controller的构造函数中实例化了MyService。问题在于,在构造MyService时,控制器的Server属性为null。我使用了publiccontroller():base(){}来获取要

我从
Mvc.Controller
继承了自己的
App.Controller
,然后我的所有控制器都从中继承。我使用接口编写了一个提供者,并将其实现为
MyService
,构造函数使用
Mvc.Controller
Server
属性,该属性属于
HttpServerUtilityBase

但是,我在
App.Controller
的构造函数中实例化了
MyService
。问题在于,在构造
MyService
时,控制器的
Server
属性为
null
。我使用了
publiccontroller():base(){}
来获取要构造的基。但是,
服务器
仍保持为
null

如果可能的话,我希望避免使用
Web.HttpContext.Current.Server

有人能解决这个问题吗

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

编辑2:没关系,我是个傻瓜。我还有另一个
控制器
也在使用
服务器
,但没有改变。案件结案

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


这是你的问题。您需要传递一个已构造到您的
App.Controller
构造函数中的
MyService
实例。请看控制/依赖注入模式的反转,并看一些使这些模式变得容易的库()。

使用延迟初始化来构造服务

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

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

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

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

确实,在
控制器
构造函数中
服务器
为空。但您可以使用
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"); 
}

或者重写Controller.Initialize,它会在正确的时间触发。延迟初始化的最好部分是,如果从未访问该属性,则不会发生延迟初始化。ASP.NET MVC非常可插入,您可以编写自己的ControllerFactory,也可以从库中使用。我喜欢Autofac,所以我告诉ASP.NET MVC使用Autofac的ControllerFactory。Autofac将参数自动连接到我的控制器的构造函数,并且构造函数没有任何“污点”。如果构造
MyService
需要
Controller.Server
,则在将其传递给控制器之前无法构造它