C# MVC/nInject:实现我自己的ApplicationUserManager
我正在MVC4应用程序中使用nInject。我想实现我自己版本的ApplicationUserManager,因为搭建的版本创建了我的数据库上下文的一个单独实例(我使用nInject将请求范围数据库上下文注入到我的控制器中)。在ApplicationUserManager中使用单独的数据库上下文会在操作用户凭据时导致一些奇怪的问题 但是我在创建nInject绑定时遇到了一个问题:C# MVC/nInject:实现我自己的ApplicationUserManager,c#,asp.net-mvc,asp.net-mvc-4,ninject,C#,Asp.net Mvc,Asp.net Mvc 4,Ninject,我正在MVC4应用程序中使用nInject。我想实现我自己版本的ApplicationUserManager,因为搭建的版本创建了我的数据库上下文的一个单独实例(我使用nInject将请求范围数据库上下文注入到我的控制器中)。在ApplicationUserManager中使用单独的数据库上下文会在操作用户凭据时导致一些奇怪的问题 但是我在创建nInject绑定时遇到了一个问题: private static void RegisterServices(IKernel kernel) {
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<CampaignDbContext>().ToSelf().InRequestScope();
kernel.Bind<ApplicationUserManager>().ToSelf().InRequestScope();
kernel.Bind<ApplicationSignInManager>().ToSelf().InRequestScope();
}
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().ToSelf().InRequestScope();
kernel.Bind().ToSelf().InRequestScope();
kernel.Bind().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
public ApplicationUserManager(活动数据库上下文)
:base(新用户存储(上下文))
{
//为用户名配置验证逻辑
UserValidator=新的UserValidator(此)
{
AllowOnlyAlphanumericUserNames=true,
RequireUniqueEmail=true
};
//等
我认为,因为CampaignDbContext本身是自绑定的,所以它的实例将被传递到ApplicationUserManager的构造函数中。但根据我收到的错误消息,这种情况似乎没有发生
如何配置nInject绑定?
ApplicationUserManager
应继承自UserManager
。UserManager
的构造函数采用UserStore
,最后UserStore
的构造函数采用DbContext
与其尝试在上下文中传递到首先应该依赖于它的ApplicationUserManager
,不如告诉Ninject如何实现IUserStore
:
kernel.Bind().To().InRequestScope();
Bind(typeof(IUserStore)).To(typeof(UserStore)).InRequestScope();
然后,您只需将
ApplicationUserManager
注入到它需要的地方,Ninject将自动用UserManager
实例填充它,该实例由您的ActivityDBContext
初始化ApplicationUserManager
应该继承自UserManager
。UserMan的构造函数ager
接受UserStore
,最后UserStore
的构造函数接受DbContext
与其尝试在上下文中传递到首先应该依赖于它的ApplicationUserManager
,不如告诉Ninject如何实现IUserStore
:
kernel.Bind().To().InRequestScope();
Bind(typeof(IUserStore)).To(typeof(UserStore)).InRequestScope();
然后,您只需将
ApplicationUserManager
注入到它需要的地方,Ninject就会自动填充一个UserManager
实例,该实例由您的ActivityDBContext
Thanx初始化。我必须承认我不理解typeof(x)的语法现在要弄清楚为什么ApplicationSignInManager不断爆炸,typeof(x)
是传递泛型类型而不向泛型指定类型参数所必需的。这允许您将IUserStore
的所有引用绑定到UserStore
,而不考虑最终的底层类型。否则,您必须为IUserStore
和IUserStore
等单独绑定我必须承认我不理解typeof(x)的语法,但它是有效的。现在,我要弄清楚为什么ApplicationSignInManager一直在爆炸,typeof(x)
是传递泛型类型而不向泛型指定类型参数所必需的。这允许您将IUserStore
的所有引用绑定到UserStore
,而不考虑最终的底层类型。否则,您必须为IUserStore
、IUserStore
等单独绑定。
kernel.Bind<DbContext>().To<CampaignDbContext>().InRequestScope();
kernel.Bind(typeof(IUserStore<>)).To(typeof(UserStore<>)).InRequestScope();