gpt4 book ai didi

dependency-injection - 当 Controller 在 Web API DI 中实例化接口(interface)的正确实现时, "magic"在哪里发生?

转载 作者:行者123 更新时间:2023-12-02 00:01:52 26 4
gpt4 key购买 nike

在我看来,当涉及到 Web API Controller 中的 DI 时,有些地方正在从帽子里拉出一只兔子。

我明白了:0)Web API项目中的Controller可以调用各种类进行实例化,这些类都实现了Controller所依赖的接口(interface)。例如,使用此 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 使用自己的替代路由引擎拦截 Controller 的这种自动控制。

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

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

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

最佳答案

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

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

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

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

阅读更多关于 Mark Seemann post 的信息关于 webapi 和温莎管道。

具体将用于满足给定的接口(interface)依赖性,这取决于您选择在工厂中使用的 ioc,如上所述。使用 Windsor,您可以/应该在 Installers 中链接界面和混凝土.

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

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

关于dependency-injection - 当 Controller 在 Web API DI 中实例化接口(interface)的正确实现时, "magic"在哪里发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20846691/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com