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
,则在将其传递给控制器之前无法构造它