Я запускаю проект в ASP.NET MVC, используя Ninject для реализации внедрения зависимостей. Вот моя текущая архитектура:
Реферативные репозитории
public interface IAccountRepository<T> where T : class
{
IQueryable<T> Retrieve();
T RetrieveByID(int id);
T RetrieveByEmail(string name);
bool Create(T entity);
bool Update(T entity);
bool Delete(T entity);
}
public interface IRepository<T> where T : class
{
IQueryable<T> Retrieve();
T RetrieveByID(int id);
T RetrieveByName(string name);
bool Create(T entity);
bool Update(T entity);
bool Delete(T entity);
}
Бетонные хранилища
public class UserRepository : IAccountRepository<User>
{
// implementation omitted
}
public class ComicBookIssuesRepository
: IRepository<ComicBookIssue>
{
// implementation omitted
}
Контроллеры
public class AccountController : Controller
{
private IAccountRepository<User> userRepository;
public AccountController(
IAccountRepository<User> repository)
{
this.userRepository = repository;
}
}
public class ComicBookIssueController : Controller
{
private IRepository<ComicBookIssue> issueRepository;
public ComicBookIssueController(
IRepository<ComicBookIssue> repository)
{
this.issueRepository = repository;
}
}
Внедрение зависимостей
public class NinjectControllerFactory
: DefaultControllerFactory
{
private IKernel ninjectKernel;
public NinjectControllerFactory()
{
ninjectKernel = new StandardKernel();
AddBindings();
}
protected override IController GetControllerInstance(
RequestContext requestContext, Type controllerType)
{
return controllerType == null ? null :
(IController)ninjectKernel.Get(controllerType);
}
private void AddBindings()
{
ninjectKernel.Bind<IRepository<ComicBookIssue>>()
.To<ComicBookIssuesRepository>();
ninjectKernel.Bind<IAccountRepository<User>>()
.To<UserRepository>();
}
}
Привязка IRepository<ComicBookIssue>
к ComicBookIssuesRepository
работает нормально, поскольку она способна создать и ввести ComicBookIssueController
без ошибок. Однако при попытке вставить в AccountController
выдается следующая ошибка:
Ошибка активации IAccountRepository {Пользователь} Нет соответствующих привязок
доступны, и тип не является самосвязываемым. Путь активации:
2)
Инъекция зависимости IAccountRepository {User} в параметр
хранилище конструктора типа AccountController
1) Запрос на
AccountController
Предложения:
1) Убедитесь, что вы определили привязку для
IAccountRepository {User}.
2) Если привязка была определена в модуле,
убедитесь, что модуль был загружен в ядро.
3) Обеспечить
вы случайно не создали более одного ядра.
4) Если вы
используя аргументы конструктора, убедитесь, что имя параметра совпадает
имя параметра конструкторов.
5) Если вы используете автоматический модуль
загрузка, убедитесь, что путь поиска и фильтры правильные.
Я не могу понять, что является причиной ошибки для одной зависимости, а не для другой. Они следуют одному и тому же шаблону, просто реализуют разные интерфейсы. Кто-нибудь еще сталкивался с этой ошибкой или может найти проблему с моей реализацией?