Я использую AutoFAC 2.2.4 и у меня вопрос по поводу ковариации в разрешении контейнера.
У меня есть определение базового интерфейса для моих репозиториев:
IRepository<T, TKey>
Который имеет Find (Tkey), FindAll () и т. Д.
Используется, например, так:
IRepository<Catalog, int>
, означающее, что в каталоге есть целочисленный ключ.Я зарегистрировал его хранилище так:
builder.RegisterType<CatalogRepository>()
.As<IRepository<Catalog, int>>();
Все было хорошо.Позже я понял, что мне нужен дополнительный тип .Find (), поэтому я защищаю новый интерфейс:
ICatalogRepository : IRepository<Catalog, int>
{
Catalog Find(string name);
}
И я изменил регистрацию:
builder.RegisterType<CatalogRepository>()
.As<ICatalogRepository>();
Но теперь попытки разрешитьIRepository <Каталог, int> не удалось.Я думал, что Autofac распознает связь с ICatalogRepository и разрешит ее.Я должен был сделать это:
builder.RegisterType<CatalogRepository>()
.As<ICatalogRepository>()
.As<IRepository<Catalog, int>>();
Чтобы они оба решили.(Есть все еще вызовы для разрешения IRepository от других универсальных инструментов манипуляции сущностями, которые не знают о производном интерфейсе.) Я делаю что-то не так?