我在MVC4应用中使用nInject。我想实现我自己的ApplicationUserManager版本,因为scaffolded创建了一个单独的数据库上下文实例(我使用nInject将请求范围数据库上下文注入到我的控制器中)。 ApplicationUserManager中具有单独的数据库上下文在操作用户凭据时会导致一些奇怪的问题。
但是我遇到了创建nInject绑定的问题:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<CampaignDbContext>().ToSelf().InRequestScope();
kernel.Bind<ApplicationUserManager>().ToSelf().InRequestScope();
kernel.Bind<ApplicationSignInManager>().ToSelf().InRequestScope();
}
第一个工作正常,大概是因为CampaignDbContext有一个无参数构造函数。
但是第二个和第三个失败了。 ApplicationUserManager的构造函数定义为:
public ApplicationUserManager( CampaignDbContext context )
: base( new UserStore<CampaignDbUser>( context ) )
{
// Configure validation logic for usernames
UserValidator = new UserValidator<CampaignDbUser>(this)
{
AllowOnlyAlphanumericUserNames = true,
RequireUniqueEmail = true
};
// etc
我认为因为CampaignDbContext本身是自绑定的,所以它的实例将被传递给ApplicationUserManager的构造函数。但根据我收到的错误消息,似乎并没有发生这种情况。
如何配置nInject绑定?
答案 0 :(得分:5)
ApplicationUserManager
应该继承自UserManager<TUser>
。 UserManager<TUser>
的构造函数需要UserStore<TUser>
,最后UserStore<TUser>
的构造函数需要DbContext
。
首先告诉Ninject如何实现ApplicationUserManager
,而不是尝试将上下文传递给应该依赖于它的IUserStore<TUser>
:
kernel.Bind<DbContext>().To<CampaignDbContext>().InRequestScope();
kernel.Bind(typeof(IUserStore<>)).To(typeof(UserStore<>)).InRequestScope();
然后,您只需将ApplicationUserManager
注入其中需要的位置,Ninject会自动使用UserManager<TUser>
初始化的CampaignDbContext
实例填充它。