3

幾乎所有我見過的Ninject示例都解釋瞭如何在ASP.NET MVC中使用它,它會自動將依賴注入到控制器中。我如何手動使用Ninject?比方說,我有一個自定義的ActionResult:如何在使控制器與IoC框架無關時使用Ninject和ActionResults?

public class JsonResult : ActionResult 
{ 
    [Inject] public ISerializer Serializer { get; set; } 

    public JsonResult(object objectToSerialize) 
    { 
     // do something here 
    } 

    // more code that uses Serializer 
} 
在我的控制器

然後,我在方法中使用JsonResult這樣的:

public ActionResult Get(int id) 
{ 
    var someObject = repo.GetObject(id); 
    return new JsonResult(someObject); 
} 

正如你所看到的,我實例化對象自己,這避開了Ninject的注射,並且Serializer將爲空。然而,這樣做的以下方式似乎不太對我說:

public ActionResult Get(int id) 
{ 
    var someObject = repo.GetObject(id); 
    return IoC.Kernel.Get<JsonResult>(someObject); 
} 

因爲現在不僅是一個在控制器上Ninject的依賴,但我也有揭露Ninject內核在一個靜態類/單例,並確保依賴注入的對象只能通過內核創建。

有沒有辦法以某種方式配置Ninject注入依賴而不依賴於公開內核?如果可能,我希望能夠使用new關鍵字。

回答

12

使用一個工廠,獲得注入的內核:如

public class ResultFactory : IResultFactory 
{ 
    public ResultFactory(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    public JsonResult CreateJsonResult(object obj) 
    { 
     var result = this.kernel.Get<JsonResult>(); 
     result.ObjectToSerialize = obj; 
     return result; 
    } 
} 

將此工廠注入到控制器中並使用它來創建您的操作結果。

+0

+1 - 這正是我所要做的。 – 2010-11-03 15:50:35

0

我覺得你應該把你的JsonResult內而外:

public ActionResult Get(int id) 
{ 
    var result = IoC.Kernel.Get<JsonResult>(); 

    result.ObjectToSerialize = repo.GetObject(id); 

    return result; 
} 

改變JsonResult的簽名也使Ninject:

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

    public object ObjectToSerialize { get; set; } 

    public JsonResult(ISerializer serializer) 
    { 
     this.Serializer = serializer; 
    } 

    // more code that uses Serializer 
} 

這樣你就可以用這樣的容器檢索JsonResult自動創建一個實例。正因爲如此,你可以讓Ninject自動注入它的依賴到你的控制器:

public MyController(JsonResult result) 
{ 
    this.result = result; 
} 

public ActionResult Get(int id) 
{ 
    this.result.ObjectToSerialize = repo.GetObject(id); 

    return this.result; 
} 
+0

這看起來沒有什麼比我有什麼不同。它只是用'ObjectToSerialize'反轉'IoC.Kernel.Get <>'。我希望能夠完全移除'IoC.Kernel.Get <>'調用。 – 2010-11-03 07:48:24

+0

當你想刪除'IoC.Kernel.Get <>'調用時,你應該讓Ninject在你的控制器的構造函數中注入你的依賴。通過改變'JsonResult'的方式,我可以讓你做自動的構造函數注入。看看我更新的例子。 – Steven 2010-11-03 08:04:34

相關問題