绑定到Ninject的CustomMembershipProvider未调用Initialize方法
本文关键字:调用 Initialize 方法 CustomMembershipProvider Ninject 绑定 | 更新日期: 2023-09-27 17:59:02
我创建了一个自定义成员资格提供程序,该提供程序在其构造函数中接受IUsersPositionary的实例。
private IUsersRepository usersRepository;
public CustomMembershipProvider(IUsersRepository usersRepository)
{
this.usersRepository = usersRepository;
}
此依赖项使用Ninject 绑定
Bind<IUsersRepository>().To<SqlUsersRepository>().WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString);
Bind<MembershipProvider>().To<CustomMembershipProvider>();
并在我的AccountController中使用,就像一样
CustomMembershipProvider provider;
public AccountController(MembershipProvider membershipProvider)
{
this.provider = (CustomMembershipProvider)membershipProvider;
}
[HttpPost]
public ActionResult Register(User user)
{
MembershipCreateStatus status = new MembershipCreateStatus();
provider.CreateUser(user.FirstName, user.LastName, user.Email, user.Password, out status);
return View(user);
}
这个问题是,当CustomMembershipProvider被实例化时,Initialize方法不会被调用,因此我修改的Web.Config不会被读取。
作为补充,我注意到CustomMembershipProvider被实例化了两次——第一次是如上所述,然后是在调用[HttpPost]操作方法时。第二次使用无参数构造函数实例化它时,它调用Initialize方法。我不知道第二个CustomMembershipProvider会发生什么,因为provider.CreateUser()
使用了我未初始化的CustomMembershipProvider。
我希望我已经很好地解释了这一点,任何帮助都将不胜感激。
我不知道你是否在使用Ninject.Mvc3扩展(你可能应该使用),但这将允许你在每个web请求中有一个MembershipProvider的实例。你必须这样做绑定:
Bind<MembershipProvider>().To<CustomMembershipProvider>().InRequestScope();
如果希望每次都返回相同的实例,则可以使用InSingletonScope。
在Mvc应用程序中进行绑定的时候,访问web.config是不可能的,但我通常通过使用自定义配置部分并将其绑定到方法来绕过这一点。通过这样做,在内核被要求提供配置节之前,该方法将不会得到评估,并且在那时可以访问web.config。类似的方法可能适用于您的连接字符串。
Bind<MyConfigurationSection>().ToMethod(context => (MyConfigurationSection)ConfigurationManager.GetSection("mysection")).InSingletonScope();
Public Class SomeRolProvider
Inherits RoleProvider
Implements IProvider
'this service needs to get initialized
<Inject()>
Public Property _memberhip As IMemberschipService
Sub New()
'only this constructor is called
End Sub
Protected Overrides Function CreateKernel() As Ninject.IKernel
Dim modules = New NinjectModule() {New Anipmodule()}
Dim kernel = New StandardKernel(modules)
kernel.Inject(Roles.Provider)
kernel.Inject(Membership.Provider)
Return kernel
End Function
这将强制内核绑定memberschip提供程序的属性
感谢大家在这个问题上的帮助。如果不需要大量的代码,我无法找到一个适用于这种应用程序情况的解决方案。
为了解决这个问题,我查看了默认的MVC 2项目,并复制了一些微软的代码。我的项目可能不是很容易测试,但我需要一个快速的解决方案。我对它进行了设置,这样,如果我将来有时间找到解决方案,我就可以用当前代码替换它。