Ошибка при введении зависимости в конструктор контроллера - PullRequest
0 голосов
/ 18 февраля 2012

Я запускаю проект в 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) Если вы используете автоматический модуль загрузка, убедитесь, что путь поиска и фильтры правильные.

Я не могу понять, что является причиной ошибки для одной зависимости, а не для другой. Они следуют одному и тому же шаблону, просто реализуют разные интерфейсы. Кто-нибудь еще сталкивался с этой ошибкой или может найти проблему с моей реализацией?

1 Ответ

0 голосов
/ 21 февраля 2012

В комментариях к моему оригинальному сообщению, Remo было правильно в отношении конфликтующего кода. В моем проекте осталась конфликтующая версия класса модели User, которую я забыл удалить. Контроллер ссылался на этот класс, в то время как Ninject связывался с другой версией. Удаление старой версии решило проблему.

...