3

我使用ASP.NET MVC 2來實現Web服務,我有一個自定義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來進行序列化。

我使用Ninject作爲我的IoC容器。但是,我不確定我應該如何注入ISerializer依賴項。我原本是這樣做的:

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

但是,它的東西看起來不太正確。那麼我將如何正確注入Serializer屬性呢?我想在應用程序啓動時只注入一次。

回答

4

對不起,MVC是不是我的聯賽,但有一些原因,你不能刪除static修改的JsonNetSerializer設定壽命是單身,並有注入的JsonResult構造?特別注意,這使得依賴ISerializer明確(好東西),並避免static(一件好事)。

+0

因此,這是否意味着,爲了將'Serializer'屬性保持爲單例,我必須始終使用IoC容器來實例化'JsonResult'的實例? – 2010-11-20 03:37:00

+1

@Daniel T .:最好你應該使用一個工廠。所以如果你有一個實例化'ConcreteJsonResult'的類,它應該使用'JsonResultFactory'。當然,你可以沿着'return kernel.Get ();'''的方式創建'JsonResultFactory.Create '。 – jason 2010-11-20 03:43:41

+0

謝謝傑森。我一直避免創建工廠,因爲我的應用程序非常簡單,使用工廠似乎不必要地使事情複雜化,但我想我會試一試。 – 2010-11-20 08:56:00