Существуют ли какие-нибудь готовые решения, позволяющие резолвить типы внутри метода контроллера (желательно с возможностью настройки через XML, как в Unity)?
Добрый день!
Если Вы пытаетесь резолвить что-то из IoC-контейнера в методе действия, значит, Вы идете по не совсем правильному пути (т.к. резолвить напрямую из контейнера приводит к значительным утечкам памяти из-за того, что GC не может их очистить, т.к. они "используются" самим IoC-контейнером). Что мешает Вам передавать Ваш ISomeRepository в конструктор контроллера и записывать его в private field?
Я бы делал так, как предложил
Free_ze в комментариях к Вашему вопросу:
- Пишем фабрику контроллеров (или подключаем готовую, если она есть в комплекте с IoC-контейнером)
- Вставляем интерфейсы в конструкторы контроллеров
Контроллер будет выглядеть в этом случае так:
private readonly ISomeRepository _someRepo;
public MyController(ISomeRepository someRepo)
{
if(someRepo == null)
throw new ArgumentNullException(nameof(someRepo));
_someRepo = someRepo;
}
Дальше используем _someRepo как душе будет угодно. Такой подход более правильный с точки зрения разрешения зависимостей. Про IoC-контейнер, по сути, должен знать только тот, кто его конфигурирует.
P.S. Бонус: если у Вас много репозиториев и интерфейсов для них, значит, настала пора рефакторинга. Смотрите в сторону GenericRepository + UnitOfWork.