2014-02-21 107 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在应用程序中引起了许多问题。感谢评论艾哈迈德。 –