Метод AsClosedTypesOf
регистрирует закрытый тип (не универсальный), который реализует определенный открытый тип.
Ваш код будет работать, если одна сборка содержит закрытую реализацию IGenericRepository<TestObject>
public class TestRespository : IGenericRepository<TestObject>
{ }
В вашем случае вы хотите зарегистрировать открытый универсальный, без сканирования сборки это делается с помощью
builder.RegisterGeneric(typeof(GenericRepository<>)).As(typeof(IGenericRepository<>))
, но из-за ограничений, описанных в этой проблеме Github ( Поддержка регистрации открытых универсальных типов при сканировании сборок ), это невозможно.
Один из распространенных способов обхода проблемы - выполнить собственное сканирование сборки:
var repositories = assembly.GetTypes().Where(t =>
{
return t.GetTypeInfo()
.ImplementedInterfaces.Any(
i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IGenericRepository<>));
});
foreach (var repository in repositories)
{
builder.RegisterGeneric(repository).As(typeof(IGenericRepository<>));
}