绑定到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的CustomMembershipProvider未调用Initialize方法

我不知道你是否在使用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项目,并复制了一些微软的代码。我的项目可能不是很容易测试,但我需要一个快速的解决方案。我对它进行了设置,这样,如果我将来有时间找到解决方案,我就可以用当前代码替换它。