Как вы можете ввести поставщика членства ASP.NET (MVC2) с использованием NINCET?
-
23-10-2019 - |
Вопрос
Итак, я работал над этим часами. Я нашел здесь пару постов, но ничего, что на самом деле решает проблему. Итак, позвольте мне попробовать еще раз ...
У меня есть приложение MVC2 с использованием Ninject и пользовательского поставщика членства.
Если я попытаюсь внедрить поставщика, используя CTOR, я получаю ошибку: «Ни один конструктор без параметра не определен для этого объекта».
public class MyMembershipProvider : MembershipProvider
{
IMyRepository _repository;
public MyMembershipProvider(IMyRepository repository)
{
_repository = repository;
}
Я также играл с заводами и инициализированным (), но все идет за пробелами.
Есть мысли/примеры?
Решение
Вот как я смог это сделать:
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;
}
}
...
При таком подходе не имеет значения, когда поставщик членов создается экземпляр.
Другие советы
Модель поставщика членства может создать создание поставщика только тогда, когда у него есть конструктор по умолчанию. Вы можете попробовать это, используя шаблон локатора сервиса, вместо использования впрыска зависимостей. Пример:
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>;
}
У меня была та же проблема в том же месте в книге. Лишь позже в книге я заметил, что были два отдельных файла Web.Config. Первоначально я поместил свой ключ ConnectionString в неправильный файл web.config. Только когда я разместил ConnectionString в правильном файле web.config, ошибка «без параметра -конструктора» исчезла.