Проблема привязки к членству по умолчанию. Поставщик в App_Start - PullRequest
1 голос
/ 31 марта 2011

Я пытаюсь использовать 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);
  }
}

Спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 11 июля 2011

Измените привязку на:

Bind<IMembershipService>().To<MembershipService>();
Bind<MembershipProvider>().ToMethod(ctx => Membership.Provider);
0 голосов
/ 10 июля 2011

Попробуйте добавить:

[сборка: WebActivator.PostApplicationStartMethod (typeof ((MyProject.App_Start.NinjectMVC3), "OnApplicationStarted")]

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

Сделайте ваш начальный загрузчик. Начать (CreateKernel) в Start ... не после запуска.

...