2014-02-21 105 views
0
public AccountController(IUserStore<ApplicationUser> userStore) 
    { 
     //uncommenting the following line, uses the correct context, but 
     //unit testing fails to work, as it is overwritten, so I need to use IoC 
     //to inject 

     //userStore = new UserStore<ApplicationUser>(new ApplicationDbContext()); 

     UserManager = new UserManager<ApplicationUser>(userStore); 

我的ninject綁定應該是什麼樣子?我能夠編譯的唯一東西看起來像下面這樣,但是沒有得到正確的上下文。我應該使用什麼ninject綁定?

 kernel.Bind<IUserStore<ApplicationUser>>().To<UserStore<ApplicationUser>>(); 

具有約束力的東西,而不是在註釋掉線使用正確的上下文

回答

2

嘗試使用ConstructorArgument

kernel.Bind<IUserStore<ApplicationUser>() 
    .To<UserStore<ApplicationUser>>() 
    .WithConstructorArgument(new ConstructorArgument("context", new ApplicationDbContext()) 

但是...

在現實中,你應該注入依賴於你的UserStore<ApplicationUser>,綁定ApplicationDbContext。然後,框架將構建整個圖形爲您提供:

kernel.Bind<ApplicationDbContext>().ToSelf()

+0

這工作,但第二行是沒有必要的,但我會相信你的話,我可能需要它。簡單的谷歌搜索沒有提供WithConstructorArgument的簡單指南。我會繼續尋找。 – WhiskerBiscuit

+0

順便說一句,你是什麼意思的整個圖表? – WhiskerBiscuit

+0

您的整個依賴關係圖。 A取決於依賴於C的B等等。在正確配置所有綁定後,當通過容器創建A時,B被注入到A中,C被注入到B. – cvbarros

0

從cvbarros回答我們提出了以下幾點:

kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope(); 
kernel.Bind<IUserStore<ApplicationUser>>() 
    .To<UserStore<ApplicationUser>>() 
    .WithConstructorArgument("context", context => kernel.Get<ApplicationDbContext>()); 

這使得ApplicationDbContext被注入和/或UserManager到被注射。它還允許UserManager從依賴注入器獲取ApplicationDbContext,而不是創建新實例。

注意,這一代碼進入在/App_Start/NinjectWebCommon.cs文件

+1

SingletonScope中的ApplicationDbContext對我來說似乎有點危險。 –

+1

回答基於艾哈邁德的評論更新。 InSingletonScope根本不是我們想要的。我們正在尋找InRequestScope。 InSingletonScope在應用程序中引起了許多問題。感謝評論艾哈邁德。 –