Как вы можете внедрить пользовательский провайдер членства asp.net (mvc2), используя Ninject? - PullRequest
4 голосов
/ 03 июня 2010

ОК, так что я работал над этим часами. Я нашел пару постов здесь, но ничего, что действительно решает проблему. Итак, позвольте мне попробовать это снова ...

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

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

public class MyMembershipProvider : MembershipProvider
{
    IMyRepository _repository;

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

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

Есть мысли / примеры?

Ответы [ 3 ]

5 голосов
/ 03 июня 2010

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

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 голос
/ 21 октября 2010

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

1 голос
/ 07 августа 2010

Вот как я смог это сделать:

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;
            }
        }
        ...

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

...