我创建了一个自定义成员资格提供程序,它在其构造函数中获取了IUsersRepository的实例。
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。
我希望我已经解释得很好,任何帮助都会受到赞赏。
答案 0 :(得分:0)
我无法判断您是否正在使用Ninject.Mvc3扩展(您可能应该使用),但这将允许您为每个Web请求设置一个MembershipProvider实例。你必须像这样进行绑定:
Bind<MembershipProvider>().To<CustomMembershipProvider>().InRequestScope();
如果要在每次使用InSingletonScope时返回相同的实例。
在Mvc应用程序中进行绑定时,无法访问web.config,但我通常通过自定义配置部分并将其绑定到方法来解决这个问题。通过这样做,在内核被要求配置部分之前,不会对该方法进行评估,并且此时可以访问web.config。类似的东西可能适用于您的连接字符串。
Bind<MyConfigurationSection>().ToMethod(context => (MyConfigurationSection)ConfigurationManager.GetSection("mysection")).InSingletonScope();
答案 1 :(得分:0)
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
这将强制内核绑定成员芯片提供程序的属性
答案 2 :(得分:0)
感谢大家对这个问题的帮助。我无法找到适用于此应用程序情况的解决方案,而无需大量代码。
为了解决这个问题,我查看了默认的MVC 2项目,并复制了一些微软的代码。我的项目可能不太可测试,但我需要一个快速的解决方案。我已经设置好了,如果我将来有时间找到解决方案,我将能够用当前代码替换它。