Как связать интерфейсы универсального типа в Ninject
Я довольно новичок в Ninject и обнаружил, что спотыкаюсь, когда пришел реализовать общий шаблон репозитория. Я хочу связать зависимость IRepository
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<EntityType>>();
... но Ninject не примет это, потому что не знает или не заботится о том, что EntityType реализует IEntityType. Как я могу связать эту зависимость?
ОБНОВИТЬ
Это ошибка, которую я получаю:
Ошибка 3 Тип "ICM.Dependency.Repository.ConcreteRepository" нельзя использовать в качестве параметра типа "TImplementation" в универсальном типе или методе "Ninject.Syntax.IBindingToSyntax.To()". Не существует неявного преобразования ссылок из 'ConcreteRepository
' в 'IRepository '.
РЕШЕНИЕ
Я до сих пор не совсем понимаю, почему моя привязка не работает, но, очевидно, я неправильно использовал дженерики там. Как таковое решение на самом деле не относится к NInject. Я закончил указывать ConcreteRepository для явного соединения IEntityType с TEntityType:
public class ConcreteRepository<TInterface, TEntity> : IRepository<TInterface> where TEntity : TInterface { ... }
Тогда инъекция может быть записана следующим образом:
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<IEntityType,EntityType>>()
1 ответ
kernel.Bind(typeof(IRepository<>)).To(typeof(SimpleRepository<>));
Посмотрите на мой, если вы хотите здесь: http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html меня есть примеры связывания
РЕДАКТИРОВАТЬ:
Ошибка, которую вы получаете, говорит о том, что ваш конкретный репозиторий не является экземпляром универсального репозитория, к которому вы хотите привязать, то есть вам нужно будет сделать это
public class ConcreteRepository<ConcreteEntity> : IRepository<IEntity>{}
не
public class ConcreteRepository<ConcreteEntity> : IRepository<ConcreteEntity>{}