Это поведение объясняется в комментариях XML для перегрузки Collection.Register(Type, Assembly[])
, которую вы вызываете:
Регистрирует все конкретные неуниверсальные типы (как публичные, так и внутренние), которые определены в данном наборе assemblies
и реализуют данный serviceType
с образом жизни по умолчанию, и регистрируют их как коллекция serviceType
. [Акцент мой]
Ваши типы, однако, являются общими. Общие типы не зарегистрированы, потому что они часто требуют особого ухода.
Чтобы зарегистрировать эти универсальные типы, есть два варианта.
Вы можете использовать Collection.Append
для добавления или добавления следующих типов в коллекцию:
// Bar<T> is prepended
container.Collection.Append(typeof(IFoo<>), typeof(Bar<>));
// All non-generic registrations next
container.Collection.Register(typeof(IFoo<>), assemblies);
// Baz is appended. It will be the last element of the collection
container.Collection.Append(typeof(IFoo<>), typeof(Baz<>));
Второй вариант - использовать GetTypesToRegister
для получения всех типов, в том числе универсальных:
var types = container.GetTypesToRegister(
typeof(IFoo<>),
assemblies,
new TypesToRegisterOptions { IncludeGenericTypeDefinitions = true });
container.Collection.Register(typeof(IFoo<>), types);
Здесь мы вызываем GetTypesToRegister
, предоставляя TypesToRegisterOptions
, который указывает, что он также должен возвращать универсальные типы. Этот список типов предоставляется для перегрузки Collection.Register(Type, Type[])
.
Однако обратите внимание, что в этом втором варианте порядок регистрации типов не определен и может меняться каждый раз, когда вы перекомпилируете или даже перезапускаете приложение. Если это поведение не подходит, вам придется заказать набор типов, прежде чем указывать его Collection.Register
.