2012-07-27 67 views
2

我覺得我在這裏缺少一些明顯的東西。我正在嘗試使用ninject創建一個類。該類接受存儲在HttpContext的Session中的單個字符串參數。我如何將這個參數傳遞給這個類?Ninject - 有條件地在.Net MVC中創建類3

類的樣子:

public class Manager : IManager 
{ 
    public Manager(string a) { ... } 
} 

我有一個自定義依賴解析器,看起來像:

public class NinjectDependencyResolver : IDependencyResolver 
{ 
    IKernel kernel; 
    public NinjectDependencyResolver() 
    { 
     kernel = new StandardKernel(); 
     Bind<IManager>().To<Manager>() 
    } 

    ... 
} 

一個典型的控制器的樣子:

public class ManagerController : Controller 
{ 
    public ManagerController(IManager manager) { ... } 
} 

回答

4

該參數是存儲在Session是相關的實現細節,不屬於入Ninject配置。

您應該創建一個IManagerConfiguration接口,該接口對於管理器的每個配置值以及該接口的會話存儲實現都具有一個屬性。現在您可以爲它們添加一個簡單的綁定,並將接口傳遞給管理器構造函數而不是字符串。

+0

這樣做。謝謝! – Ross 2012-07-27 15:25:00

0

試試這個

  var copyToNew = new ConstructorArgument("isCopyToNew", IsCopyToNew); 
      IParameter[] pars = new Parameter[] { copyToNew }; 
      var anyViewModel = IoC.Kernel.Get<IAnyViewModel>(pars); 

var anyViewModel=IoC.Kernel.Get<IAnyViewModel>(new ConstructorArgument("isCopyToNew",IsCopyToNew)); 
1

UPDATE:

會議不能在最初的時候訪問,請檢查下面@詹姆斯回答。

您是否嘗試過使用WithConstructorArgument

public class NinjectDependencyResolver : IDependencyResolver 
{ 
    IKernel kernel; 
    public NinjectDependencyResolver() 
    { 
     kernel = new StandardKernel(); 
     Bind<IManager>() 
      .To<Manager>() 
      .WithConstructorArgument("a", ..) 
    } 

    ... 
} 
+0

這將如何工作?我會猜想,這是不會工作的,因爲它是在創建解析器時訪問會話而不是在請求時。每次請求都會創建新的解析器嗎? – 2012-07-27 05:48:57

+0

你是對的我會更新答案 – VJAI 2012-07-27 07:23:14

0

如果可以從一個字符串改變管理器PARAM到Func<string>,則可以使用WithConstructorArgument和的)=> HttpContext.Current.Session [ 「foo」 的]函數求(的ToString()

如果你不能,那麼我可能會用一個帶有該字符串參數的Create方法注入一個IManagerFactory,並且雖然可以通過創建自己的工廠來手工完成,但我會使用nFind的ninject擴展。

https://github.com/ninject/ninject.extensions.factory/wiki/Factory-interface