3

私は、Webサービスを実装するためにASP.NET MVC 2を使用していると私は、カスタムJsonResultクラスがあります。Ninjectを使用して静的プロパティを挿入するにはどうすればよいですか?

public abstract class JsonResult : ActionResult 
{ 
    public static ISerializer Serializer { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var json = Serializer.Serialize(this); 
     context.HttpContext.Response.Write(json); 
    } 
} 

JsonResultは、JSONデータにシリアル化する必要があるすべての結果の抽象基本クラスです。それはISerializerを使用してシリアル化を行います。

私はIoCコンテナとしてNinjectを使用しています。しかし、私はどのようにしてISerializerの依存関係を注入すべきかわかりません。私はもともとこれをやっていた:

var kernel = new StandardKernel().Bind<ISerializer>().To<JsonNetSerializer>(); 
JsonResult.Serializer = kernel.Get<ISerializer>(); 

しかし、それについては何かがちょうど正しいとは思わない。ですから、Serializerプロパティを正しく注入するにはどうしたらいいですか?私はアプリケーションを起動するときに一度だけ注入したい。

答えて

4

申し訳ありませんが、MVCは私のリーグではありませんが、あなたは、static修飾子を削除シングルトンであることをJsonNetSerializerの寿命を設定し、JsonResultのコンストラクタに注入することを持つことができない理由はいくつかの理由がありますか?特にこれにより、ISerializerの依存関係が明示的に(良いことに)なり、static(良いこと)が回避されることに注意してください。

+0

これは、 'Serializer'プロパティをシングルトンとして保持するために、' IonCコンテナを使用して 'JsonResult'のインスタンスをインスタンス化する必要があることを意味していますか? –

+1

@Daniel T .:できるだけ工場を使うべきです。ですから、 'ConcreteJsonResult'をインスタンス化しているクラスがあれば' JsonResultFactory'を取るべきです。もちろん、 'return kernel.Get ();'の行に沿って 'JsonResultFactory.Create 'を実行するだけです。 – jason

+0

ありがとうございました。私のアプリケーションは非常にシンプルなので、工場を作ることは避けていますが、工場を使うことは不必要に複雑に思えますが、私はそれを試してみます。 –