Ninject绑定的CustomMembershipProvider未调用Initialize方法

问题描述

| 我创建了一个自定义成员资格提供程序,该提供程序在其构造函数中采用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会发生什么,因为ѭ3使用我未初始化的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项目,并复制了Microsoft的一些代码。我的项目可能不是很可测试,但是我需要一个快速的解决方案。我已经对其进行了设置,以便将来有时间找到解决方案时,可以用当前代码替换它。