Я новичок в Ninject и обнаружил, что споткнулся, когда пришел, чтобы реализовать шаблон общего репозитория. Я хочу привязать зависимость IRepository <IEntityType> к классу ConcreteRepository <EntityType> , где ConcreteRepository <T> реализует IRepository <T> и EntityType реализует IEntityType. Я пробовал это:
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<EntityType>>();
... но Ninject не возьмет это, потому что он не знает и не заботится о том, что EntityType реализует IEntityType. Как я могу связать эту зависимость?
UPDATE
Это ошибка, которую я получаю:
Ошибка 3 Тип "ICM.Dependency.Repository.ConcreteRepository" не может использоваться как параметр типа "TImplementation" в родовом типе или методе "Ninject.Syntax.IBindingToSyntax.To()". Нет никакого неявного преобразования ссылок из "ConcreteRepository <EntityType> " в "IRepository <IEntityType> ".
Решение
Я до сих пор не совсем понимаю, почему моя привязка не работает, но, очевидно, я неправильно использовал дженерики. Таким образом, решение действительно не связано с NInject. Я закончил указывать ConcreteRepository для явного подключения IEntityType с TEntityType:
public class ConcreteRepository<TInterface, TEntity> : IRepository<TInterface> where TEntity : TInterface { ... }
Тогда инъекцию можно записать следующим образом:
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<IEntityType,EntityType>>()