我正在尝试使用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);
}
}
感谢您的帮助。
答案 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。