Azure函数中的DI

Sam*_*Sam 33 asp.net azure asp.net-web-api azure-functions

我有一些类库,我在ASP.NET Web API应用程序中使用它来处理我的所有后端内容,例如对多个数据库(如Azure SQL数据库,Cosmos DB等)的CRUD操作.

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

我没有看到对DI的任何支持,但我有点困惑.似乎Azure Functions基于与WebJobs相同的SDK,我认为去年微软已经开始在WebJobs中支持DI - 我当然知道,因为我使用Ninject实现了它.

有没有解决方法,以便我可以在我的新Azure功能项目中使用我现有的库?

Sam*_*Sam 25

除了服务定位器(反)模式之外,我还看到了这两种技术.我也向Azure Functions团队询问了他们的意见.

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

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

  • Azure Functions v2 现在支持 DI:https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection (4认同)

Jan*_*n_V 8

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

但是,我接近这个的方式是使用某种"包装器"入口点,使用服务定位器解决此问题并从那里启动该功能.

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

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

var container = builder.Build();

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

  functionLogic.Execute();
}
Run Code Online (Sandbox Code Playgroud)

当然这有点笨拙,但它是最好的,直到现在(据我所知).


小智 5

我已经看到Willie-zone博客提到了很多有关该主题的文章,但是您无需走这条路就可以将DI与Azure函数一起使用。

如果使用的是Version2,则可以使Azure函数处于非静态状态。然后,您可以添加一个公共构造函数以注入依赖项。下一步是添加IWebJobsStartup类。在启动课程中,您将可以像注册其他任何.Net Core项目一样注册服务。

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

这是启动类的直接链接:https : //github.com/jedi91/MovieSearch/blob/master/MovieSearch/Startup.cs

这是函数:https : //github.com/jedi91/MovieSearch/blob/master/MovieSearch/Functions/Search.cs

希望这种方法有帮助。如果要使Azure Functions保持静态,则可以使用willie-zone方法,但是我真的很喜欢这种方法,它不需要任何第三方库。

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


mwi*_*son 5

Azure Functions 依赖注入已在 MSBuild 2019 上发布。以下是有关如何执行此操作的示例:

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]

namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddHttpClient();
            builder.Services.AddSingleton((s) => {
                return new CosmosClient(Environment.GetEnvironmentVariable("COSMOSDB_CONNECTIONSTRING"));
            });
            builder.Services.AddSingleton<ILoggerProvider, MyLoggerProvider>();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Nap*_*nes 5

如上所述,它刚刚在 Build 2019 上宣布。它现在几乎可以像在 ASP .Net Core 应用程序中一样进行设置。

微软文档

我写的短博客