问题绑定到App_Start中的默认Membership.Provider

时间:2011-03-31 09:45:12

标签: asp.net-mvc ninject

我正在尝试使用Ninject为我的自定义MembershipProvider提供(默认)AspNetSqlMembershipProvider的实例:

Bind<IMembershipService>()
  .To<MembershipService>()
  .WithConstructorArgument("provider", System.Web.Security.Membership.Provider));

我正在使用App_Start中的标准MVC3模式实例化我的Ninject模块,特别是我使用WebActivator调用静态Start()方法

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyProject.App_Start.NinjectMVC3), "Start")]

public static void Start()
{
    DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));
    bootstrapper.Initialize(CreateKernel);
}

我遇到的问题是,此时默认的System.Web.Security.Membership.Provider尚未建立,启动时出现应用程序错误。

为了解决这个问题,我通过添加WebActivator.PostApplicationStartMethod重构了代码:

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyProject.App_Start.NinjectMVC3), "Start")]
[assembly: WebActivator.PostApplicationStartMethod(typeof(MyProject.App_Start.NinjectMVC3), "PostStart")]

public static void Start()
{
    DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));
}

并将bootstrapperInitialze()调用移动到PostStart()方法中:

public static void PostStart()
{
    bootstrapper.Initialize(CreateKernel);
}

这解决了这个问题,但我想知道a)这是否可能引入其他问题,或者b)是否有替代方法?

其他细节: 我已经尝试按照建议修改绑定,但是我收到以下编译错误:

'Ninject.Syntax.BindingRoot.Bind()'是一个'方法',在给定的上下文中无效

有关信息,请参阅我的MembershipModule列表:

public class MembershipModule : NinjectModule
{
  public override void Load()
  {
     // Membership Service
     Bind<Abl.Mvc.Models.Membership.Abstract.IMembershipService>()
       .To<Abl.Mvc.Models.Membership.Services.MembershipService>()
       .WithConstructorArgument("provider", System.Web.Security.Membership.Provider)
       .WithConstructorArgument("connectionString", MembershipProvider.GetConnectionString());

     // This line errors
     Bind<MembershipProvider>.ToMethod(ctx => System.Web.Security.Membership.Provider);
  }
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

将绑定更改为:

Bind<IMembershipService>().To<MembershipService>();
Bind<MembershipProvider>().ToMethod(ctx => Membership.Provider);

答案 1 :(得分:0)

尝试添加:

[assembly:WebActivator.PostApplicationStartMethod(typeof((MyProject.App_Start.NinjectMVC3),“OnApplicationStarted”)]

    /// <summary>
    /// Application started.
    /// </summary>
    public static void OnApplicationStarted()
    {
        // Do your bindings here.
    }

你的bootstrapper.Initialize(CreateKernel)在Start ...不是post start。