2009-03-11 1 views
2

私は自分の継承したApp.ControllerMvc.Controllerからすべてのコントローラに継承しています。私はインターフェイスを利用するプロバイダを書いてMyServiceと実装し、コンストラクタはServerというプロパティーをMvc.ControllerというHttpServerUtilityBaseとしています。Mvc.Controllerでサーバーを使用

しかし、App.ControllerのコンストラクタでMyServiceをインスタンス化します。問題は、MyServiceを構築するときにコントローラのServerプロパティがnullであることです。私はpublic Controller() : base() { }を使ってベースを構築しました。ただし、Serverは、nullのままです。

できるだけWeb.HttpContext.Current.Serverを避けたいと思います。

この問題を解決する方法はありますか?

編集:まあ、私はtvanfossonの提案を実施している、と私のアプリは、プロパティget方法でMyServiceを構築する場合、Serverはまだnullです。

編集2:わからない、私は馬鹿だった。私は別のControllerを使用してServerも使用していて、それを変更しませんでした。ケースが閉まった。

答えて

7

遅延初期設定を使用してサービスを構築します。

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

次に、サービスがコントローラアクションで使用され、その時点でサーバープロパティが設定されるまで、サービスは実際にはインスタンス化されません。

+0

私はこの考えが好きです... –

+3

またはコントローラーをオーバーライドします。初期化。適切なタイミングで起動します。 –

+1

遅延初期設定の最良の部分は、プロパティが決してアクセスされないと起こらないことです。 – tvanfosson

0

私はApp.ControllerのコンストラクタでMyServiceをインスタンス化します。

問題があります。すでに構築されているMyServiceのインスタンスをApp.Controllerのコンストラクタに渡す必要があります。 Inversion of Control/Dependency Injectionパターンを見て、これらのパターンを簡単にするライブラリのいくつかを見てみましょう(see this list)。

+0

ASP.NET MVCは非常にプラグイン可能で、独自のControllerFactoryを記述するか、ライブラリから使用することができます。私はAutofacが好きなので、私はASP.NET MVCに、AutofacのControllerFactoryを使用するよう指示します。 Autofacはコントローラーのコンストラクターに引数をautowireし、コンストラクターにはすべて「汚れ」がありません。 – yfeldblum

0

なぜサーバーリファレンスが必要ですか?あなたはurl/htmlエンコーディングのようなことをしていますか?その場合は、HttpUtilityを代わりに使用し、コンテキスト参照を完全に取り除くことができます。

+1

私はServer.MapPathを使用しています。 –

0

これは非常に古い質問ですが、件名はまだ関連しています。だから、おそらく2009年には利用できなかった2017年のヒントが1つあります。

ControllerコンストラクタServerはnullです。しかし、OnActionExecutingイベントを使用することができます:

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

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

これはうまく動作します。

関連する問題