Ninject绑定CustomMembershipProvider不调用Initialize方法

时间:2011-06-14 14:29:06

标签: c# unit-testing asp.net-mvc-2 dependency-injection ninject

我创建了一个自定义成员资格提供程序,它在其构造函数中获取了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。

我希望我已经解释得很好,任何帮助都会受到赞赏。

3 个答案:

答案 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项目,并复制了一些微软的代码。我的项目可能不太可测试,但我需要一个快速的解决方案。我已经设置好了,如果我将来有时间找到解决方案,我将能够用当前代码替换它。