Мне кажется, что где-то кролика из шляпы вытаскивают, когда дело касается DI в Web API Controllers.
Я понимаю, что: 0) Контроллер в проекте веб-API может вызываться с различными классами, которые должны быть созданы, каждый из которых реализует интерфейс, от которого зависит Контроллер. например, с этим кодом контроллера:
private readonly IDepartmentRepository _deptsRepository;
public DepartmentsController(IDepartmentRepository deptsRepository)
{
if (deptsRepository == null)
{
throw new ArgumentNullException("deptsRepository is null");
}
_deptsRepository = deptsRepository;
}
..."deptsRepository" может быть классом, который реализует IDepartmentRepository и извлекает тестовые данные, ИЛИ это может быть класс, который реализует IDepartmentRepository и извлекает производственные данные, ИЛИ (и т. д.)
1) Веб-API решает, какой контроллер вызывается на основе URI, который вызывает клиент, и этот веб-API решает, какой метод в этом контроллере вызывается на основе его типа (GET, POST) и т. д. и какие аргументы, если таковые имеются, прошел с ним.
2) Castle Windsor перехватывает это автоматическое управление контроллерами с помощью собственного заменяющего механизма маршрутизации.
Чего я не понимаю, так это того, что разработчик внедряет конкретный класс, который реализует интерфейс, ожидаемый контроллером. IOW, если я хочу запустить класс, который извлекает тестовые данные, где мне добавить код, чтобы указать это? Я бы подумал, что это где-то в Global.asax.cs, что-то вроде (псевдокод):
// Use test data for now
DeptsControllerClass = TestDataClass;
//DeptsControllerClass = ProductionDataClass;
IOW, где можно указать: «На этот раз я хочу, чтобы вы внедрили ЭТОТ конкретный класс, который реализует требуемый интерфейс»?