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.

War es hilfreich?

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 in App.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"); 
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top