【发布时间】:2013-12-30 20:07:29
【问题描述】:
在我看来,当涉及到 Web API 控制器中的 DI 时,兔子在某处被拉了出来。
我觉得: 0)Web API项目中的Controller可以调用各种类进行实例化,这些类都实现了Controller所依赖的接口。例如,使用此控制器代码:
private readonly IDepartmentRepository _deptsRepository;
public DepartmentsController(IDepartmentRepository deptsRepository)
{
if (deptsRepository == null)
{
throw new ArgumentNullException("deptsRepository is null");
}
_deptsRepository = deptsRepository;
}
...“deptsRepository”可以是实现 IDepartmentRepository 并检索测试数据的类,也可以是实现 IDepartmentRepository 并检索生产数据的类,或者(等等)
1) Web API 根据客户端调用的 URI 来决定调用哪个控制器,而 Web API 根据它是什么类型(GET、POST)等来决定调用该控制器中的哪个方法以及它是什么参数,如果任何,都与它一起传递。
2) Castle Windsor 使用自己的替代路由引擎拦截控制器的这种自动控制。
我不明白的是开发人员在哪里注入了实现控制器期望的接口的具体类。 IOW,如果我想运行从测试数据中提取的类,我在哪里添加代码来指定它?我认为它会在 Global.asax.cs 中的某个地方,类似于(伪代码):
// Use test data for now
DeptsControllerClass = TestDataClass;
//DeptsControllerClass = ProductionDataClass;
IOW,在哪里指定,“这一次,我希望你注入这个实现所需接口的具体类”?
【问题讨论】:
标签: dependency-injection asp.net-web-api castle-windsor global-asax asp.net-web-api-routing