Я пытаюсь использовать Ninject для предоставления своему пользовательскому MembershipProvider экземпляра (по умолчанию) AspNetSqlMembershipProvider:
Bind<IMembershipService>()
.To<MembershipService>()
.WithConstructorArgument("provider", System.Web.Security.Membership.Provider));
Я создаю экземпляр моего модуля Ninject, используя стандартный шаблон MVC3 в App_Start,В частности, я вызываю статический метод Start () с использованием WebActivator
[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);
}
Это решает проблему, но мне было интересно, а) может ли это вызвать другие проблемы, или б) был ли альтернативный подход?
ДОПОЛНИТЕЛЬНЫЕ ДЕТАЛИ: Я попытался изменить привязки, как предложено, но я получаю следующую ошибку компиляции:
«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);
}
}
Спасибо за вашу помощь.