4

ОК, так что я работаю над этим часами. Я нашел пару сообщений здесь, но ничего, что фактически решает проблему. Итак, позвольте мне попробовать еще раз ...Как вы можете ввести пользовательский поставщик членства asp.net (mvc2), используя Ninject?

У меня есть приложение MVC2 с использованием Ninject и пользовательского поставщика членства.

Если я попытаюсь ввести поставщика с помощью ctor, я получаю сообщение об ошибке: «Без конструктора без параметров для этого объекта».

public class MyMembershipProvider : MembershipProvider 
{ 
    IMyRepository _repository; 

    public MyMembershipProvider(IMyRepository repository) 
    { 
     _repository = repository; 
    } 

Я также играл с заводами и Initialize(), но все идет вверх заготовку.

Любые мысли/примеры?

ответ

1

Это, как я был в состоянии сделать это:

1) Я создал статический вспомогательный класс для Ninject

public static class NinjectHelper 
{ 
    public static readonly IKernel Kernel = new StandardKernel(new FooServices()); 

    private class FooServices : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IFooRepository>() 
       .To<EntityFooRepository>() 
       .WithConstructorArgument("connectionString", 
        ConfigurationManager.ConnectionStrings["FooDb"].ConnectionString); 
     } 
    } 
} 

2) Вот мое членство переопределение:

public class FooMembershipProvider : MembershipProvider 
    { 
     private IFooRepository _FooRepository; 

     public FooMembershipProvider() 
     { 
      NinjectHelper.Kernel.Inject(this); 
     } 

     [Inject] 
     public IFooRepository Repository 
     { 
      set 
      { 
       _FooRepository = value; 
      } 
     } 
     ... 

При таком подходе не имеет значения, когда экземпляр провайдера членства создается.

+1

Вы связали IoC с приложением здесь :( –

5

Модель поставщика членства может создавать только сконфигурированный поставщик, если у него есть конструктор по умолчанию. Вы можете попробовать это, используя шаблон Service Locator, вместо использования Injection Dependency. Пример:

public class MyMembershipProvider : MembershipProvider 
{ 
    IMyRepository _repository; 

    public MyMembershipProvider() 
    { 
     // This example uses the Common Service Locator as IoC facade, but 
     // you can change this to call NInject directly if you wish. 
     _repository = ServiceLocator.Current.GetInstance<IMyRepository>; 
    } 
+1

Добавляя к этому, вы также можете использовать свойство injection - пометить некоторые свойства [Inject], а затем сделать Kernel.Inject (это) (Не уверен, что используемая вами модель SL/CSL выставляет такой объект) –

+0

У меня такая же проблема, и я попробовал предложение Рубена безрезультатно. Я думаю, что это происходит, потому что поставщик членства создается до того, как настроен Ninject. – mattdwen

+1

Я не думаю, что в этом сценарии может работать вложение свойств, потому что это не NInject, который создаст экземпляр «MyMembershipProvider», но это подсистема 'System.Web.Security.Membership', которая будет создавать новую пример. – Steven

1

У меня была такая же проблема в том же месте в книге. Только в этой книге я заметил, что есть два отдельных файла web.config. Первоначально я поместил свой ключ connectionString в неправильный файл web.config. Только когда я установил connectionString в правильный файл web.config, ошибка «no parameterless constructor» исчезла.