Mit Server in Mvc.Controller
-
08-07-2019 - |
Frage
Ich habe meine eigene geerbt App.Controller
von Mvc.Controller
, die von dann erben alle meine Controller. Ich schrieb einen Anbieter eine Schnittstelle und implementiert sie als MyService
Nutzung und der Konstruktor nimmt die Server
Eigenschaft Mvc.Controller
, die von HttpServerUtilityBase
ist.
Allerdings habe ich instanziiert MyService
in App.Controller
Konstruktor. Das Problem ist, dass die Server
Eigenschaft des Controllers null
wird, wenn MyService
zu konstruieren. Ich habe public Controller () : base() { }
verwendet, um die Basis zu erhalten gebaut werden. Allerdings Server
bleibt null
.
Ich möchte Web.HttpContext.Current.Server
wenn möglich vermeiden.
Hat jemand eine Arbeit um für dieses Problem hat?
Edit:. Nun, ich habe tvanfosson Vorschlag umgesetzt, und wenn mein app MyService
in der Eigenschaft get
Methode konstruiert, Server
ist immer noch null
Edit 2: Nevermind, ich war ein Patzer. Ich hatte eine andere Controller
Server
als gut verwenden und nicht das ändern. Fall geschlossen.
Lösung
Verwenden Sie verzögerte Initialisierung Ihren Dienst zu konstruieren.
private MyService service;
public MyService Service
{
get
{
if (this.service == null)
{
this.service = new MyService(this.Server);
}
return this.service;
}
}
Dann wird Ihr Dienst nicht tatsächlich instanziiert, bis er in der Controller-Aktion und bis zu diesem Zeitpunkt der Server-Eigenschaft festgelegt wurde, verwendet wird.
Andere Tipps
I instanziiert
MyService
inApp.Controller
Konstruktor.
Es ist dein Problem. Sie müssen eine Instanz von MyService
passieren, die bereits in Ihrem App.Controller
Konstruktor konstruiert wurde. Werfen Sie einen Blick auf die Inversion of Control / Dependency Injection-Muster, und werfen Sie einen Blick auf einige der Bibliotheken, die diese Muster leicht ( sehen Sie diese Liste ).
Warum benötigen Sie den Server Referenz? Tun Sie Dinge wie url / html Codierung? Wenn ja, könnten Sie HttpUtility statt und erhalten vollständig aus dem Kontext Bezug befreien.
Dies ist eine sehr alte Frage, aber das Thema ist immer noch relevant. Also, ein Hinweis im Jahr 2017, die im Jahr 2009 möglicherweise nicht zur Verfügung stand:
Es ist wahr, dass in dem Controller
Konstruktor Server
null ist. Aber Sie können das OnActionExecuting
Ereignis verwenden:
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
CurrentServer = Server; // CurrentServer is some instance variable I need later.
}
Dies funktioniert gut für mich.
Nach diese Website , wenn Sie diesen Regler haben:
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");
}
}
Dann mögen Sie es auf diese Weise initialisieren:
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
// now Server has been initialized
folderPath = Server.MapPath("~/uploads");
}