当前位置: 首页 > 知识库问答 >
问题:

Azure Functions中的DI

亢嘉茂
2023-03-14

我在ASP.NETWeb API应用程序中使用了一些类库,用于处理我所有的后端内容,例如对AzureSQLDatabase、Cosmos DB等多个数据库的CRUD操作。

我不想重新发明轮子,并能够在我在Visual Studio 2017中创建的新Azure函数中使用它们。我所有的存储库方法都使用一个接口。那么,我将如何在我的新Azure函数中实现依赖注入呢?

我没有看到对DI的任何支持,但我有点困惑。看起来Azure Functions与WebJobs基于相同的SDK,我想去年微软已经开始在WebJobs中支持DI——我很确定,因为我使用NINF实现了它。

有没有办法解决这个问题,以便我可以在新的 Azure Functions 项目中使用现有库?

共有3个答案

沙靖琪
2023-03-14

我在willie-zone的博客上看到过很多关于这个话题的内容,但是你不需要走这条路来使用DI和Azure函数。

如果您使用的是版本2,则可以使Azure功能非静态。然后,您可以添加一个公共构造函数来注入依赖项。下一步是添加IWebJobsStartup类。在startup类中,您可以像注册任何其他.Net核心项目一样注册服务。

我有一个公共存储库在这里使用这种方法:https://github.com/jedi91/MovieSearch/tree/master/MovieSearch

这里是到startup类的直接链接:https://github.com/jedi91/MovieSearch/blob/master/MovieSearch/Startup.cs

而这里是函数:https://github . com/Jedi 91/movie search/blob/master/movie search/Functions/search . cs

希望这种方法能有所帮助。如果您希望保持Azure函数的静态,那么willie zone方法应该可以工作,但我非常喜欢这种方法,它不需要任何第三方库。

需要注意的一件事是Directory.Build.target文件。此文件将在主机文件中复制您的扩展,以便在将函数部署到Azure后DI将工作。在本地运行函数不需要此文件

云正信
2023-03-14

在 Azure Functions 的 GitHub 页面上有一个关于此事的开放功能请求。

然而,我处理这个问题的方法是使用某种“包装器”切入点,使用服务定位器解决这个问题,然后从那里启动函数。

这个看起来有点像这个(简化)

var builder = new ContainerBuilder();
//register my types

var container = builder.Build();

using(var scope = container.BeginLifetimeScope())
{
  var functionLogic = scope.Resolve<IMyFunctionLogic>();

  functionLogic.Execute();
}

这当然有点粗鲁,但据我所知,这是目前最好的。

万俟财
2023-03-14

除了服务定位器(反)模式之外,我还看到了这两种技术。我也向Azure功能团队征求了他们的意见。

https://blog . Wille-zone . de/post/azure-functions-dependency-injection/

https://blog . Wille-zone . de/post/azure-functions-proper-dependency-injection/

 类似资料:
  • Azure Functions for Visual Studio Code Use the Azure Functions extension to quickly create, debug, manage, and deploy serverless apps directly from VS Code. Check out the Azure serverless community li

  • 图像比周围的div宽。这是针对美孚公司的。div中的图像具有宽度:auto;持有它的div与可见区域一样宽。因此,如果div为500px,则图像可能会变化,约为1000px。但我只想显示图像的中间部分。 Im使用OWL Carousel v1.3.3的旧版本 谢谢! 修正如下:

  • 问题内容: 我看过苹果公司的iBook,找不到任何定义: 有人可以解释一下的结构吗? 问题答案: 结构的更清晰概念: 是一个。在被实际键入别名的,但你应该只使用自己熟悉的GCD方法来获取队列。该块是一个Swift闭包。具体来说,定义为,等效于。 用法示例: 编辑: 我建议使用@matt的非常好的功能。 编辑2: 在Swift 3中,将有新的GCD包装器。看到这里:https : //github.

  • 最近,我尝试从StackDriver检索DialogFlow日志(即,包含有关会话信息/交互的所有信息),以通过启用以下选项来执行仪表板自定义分析: 但是,在我检查了DialogFlow日志条目的格式之后,似乎只有非结构化text_payload可用(即)并且没有结构化json_payload。 痛苦的是,我无法轻易地解析text_payload从中得到我想要的数据。因此,我的问题是: < li

  • 我使用子JPanel构造JScrollPane,然后尝试将JScrollPane添加到父JPanel中,希望有一个可滚动的自定义JPanel。 我有一个大的细白线前面的所有我的组件,他们是没有滚动。有什么想法吗?

  • 问题内容: 我正在使用redux和react。这使得调度可以作为组件中的道具使用。因此,当我在调度键下的日志中看到以下对象时。 有人可以解释一下这是什么吗? 问题答案: 是Chrome开发者工具在C ++ 中(在源中)在内部添加和使用的私有属性。它显示了函数范围内的变量,即可以从该函数访问哪些变量。 例如: 在这里,附加到属性的函数在其范围内具有变量,因此当我们检查属性时,我们会看到类似 您可以在