Ковариантность в автофаке? - PullRequest
0 голосов
/ 18 июля 2011

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

1 Ответ

2 голосов
/ 19 июля 2011

Это ожидаемое поведение.Однако вы можете взглянуть на функцию сканирования сборок и метод AsImplementedInterfaces, в частности.

...