Сложно ли в простом инжекторе автоматически регистрировать эти классы:
public class RepositoryA : Repository<Hammers>, IRepositoryA
{
... implementing code here ...
}
public interface IRepositoryA: IRepository<Hammers>
{ //no methods
}
public class RepositoryB : Repository<Knives>, IRepositoryB
{
... implementing code here ...
}
public interface IRepositoryB: IRepository<Knives>
{ //no methods
}
public class RepositoryC : Repository<Swords>, IRepositoryC
{
... implementing code here ...
}
public interface IRepositoryC: IRepository<Swords>
{ //no methods
}
Я следил за документацией, описанной здесь: Simple Injector — пакетная регистрация а>
Но кажется, что это не сработает, если вы попытаетесь наследоваться от другого класса и его интерфейса. Я не могу разделить интерфейсы, то есть он получает Repository и IRespositoryX, где X — буква репозитория (A, B, C и т. д.). По сути выдает ошибку:
Последовательность содержит более одного элемента
Описание: во время выполнения текущего веб-запроса возникло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.InvalidOperationException: последовательность содержит более одного элемента
Это работает, если я вручную регистрирую каждый класс, один за другим:
container.Register<IRepositoryA, RepositoryA>();
container.Register<IRepositoryB, RepositoryB>();
container.Register<IRepositoryC, RepositoryC>();
/* add more here */
Вот что у меня есть до сих пор:
var repositoryAssembly = typeof(StateRepository).Assembly;
var registrations =
from type in repositoryAssembly.GetExportedTypes()
where type.Namespace == "MappingTool.Repository"
where type.GetInterfaces().Any()
where !type.IsAbstract
select new
{
Service = type.GetInterfaces().Single(),
Implementation = type
};
foreach (var reg in registrations)
{
container.Register(reg.Service, reg.Implementation, Lifestyle.Transient);
}