当控制器实例化 Web API DI 中接口的正确实现时,“魔法”发生在哪里?

2023-11-30

在我看来,当涉及到 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 决定调用哪个 Controller,并且 Web API 根据类型(GET、POST)等以及参数(如果有)是什么来决定调用该 Controller 中的哪个方法就这样过去了。

2) Castle Windsor 使用自己的替换路由引擎拦截控制器的这种自动控制。

我不明白的是开发人员在哪里注入实现控制器期望的接口的具体类。 IOW,如果我想运行从测试数据中提取的类,我应该在哪里添加代码来指定它?我认为它会在 Global.asax.cs 的某个地方,类似于(伪代码):

// Use test data for now
DeptsControllerClass = TestDataClass;
//DeptsControllerClass = ProductionDataClass;

IOW,在哪里指定“这一次,我希望你注入这个实现所需接口的具体类”?


正如您在第 1 点所写的,路由和 IoC 是两个不同的东西。

一旦路由引擎确定必须调用哪个控制器,就会调用“控制器工厂”。

WebApi 框架允许插入您自己的工厂,如下所示:

GlobalConfiguration.Configuration.Services.Replace(
    typeof(IHttpControllerActivator),
    new WindsorCompositionRoot(this.container));

阅读更多内容马克·西曼帖子关于 web api 温莎管道。

将使用哪种具体方法来满足给定的接口依赖关系,这取决于您在工厂中选择使用的 ioc,如上所述。使用 Windsor,您可以/应该在中链接 interfce&concrete安装人员.

让我尝试回顾一下整个过程 1) 设置路由以链接 url 与控制器 2)创建容器并使用安装程序注册所有组件 3)用你最喜欢的ioc容器替换默认控制器工厂(温莎,我想:-)) 4)享受魔法。

所有这些步骤都发生在 Global.asax 中的 Application_start 中

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当控制器实例化 Web API DI 中接口的正确实现时,“魔法”发生在哪里? 的相关文章