使用 C# .NET Azure Functions 的依赖注入(带示例)
此示例的代码可以在这里找到。什么是依赖注入。依赖注入 (DI) 是一种软件设计模式,允许开发人员编写松耦合的代码。
什么是依赖注入
依赖注入 (DI) 是一种软件设计模式,允许开发人员编写松耦合的代码。 这是通过在运行时指定类需要哪些对象,而不是实现具体的依赖关系来实现的。 通过在应用程序中使用 DI 注入,您可以确保代码库是可维护的、可测试的且易于更新。
在 Azure Functions 中实现依赖注入
Microsoft 最近发布了 Microsoft.Azure.Functions.Extensions
NuGet 包(撰写本文时为 1.0.0 版本)。 此包通过构建在现有的 ASP.NET Core 依赖注入功能之上,增加了对依赖注入的本机支持。 在此示例中,我们将使用此包将 DI 实现到简单的 REST 触发器 C# 函数中。
第一步是创建一个 HTTP 函数,这可以通过 Visual Studio 或使用 Azure Function CLI 来实现。
要使用 Azure Function CLI,您需要 Azure Functions Core Tools,您可以通过 npm
安装它。
npm i -g azure-functions-core-tools --unsafe-perm true
首先,您需要创建函数项目
func init <PROJECT NAME> --worker-runtime dotnet
然后将目录更改为新创建的项目,并运行以下命令来创建函数。
func new --name <FUNCTION NAME> --template "HttpTrigger"
创建项目后,您需要添加对 Microsoft.Azure.Functions.Extensions
包的引用,并更新到最新版本的函数 SDK。 您可以使用 dotnet CLI 来做到这一点。
dotnet add package Microsoft.Azure.Functions.Extensions
dotnet add package Microsoft.NET.Sdk.Functions
首先,我们将创建将注入到我们函数中的服务。 在此示例中,我们将使用一个简单的类,该类返回问候消息。 在您的函数项目中创建以下文件(IGreeter.cs 和 Greeter.cs)。
namespace DependencyInjectionTutorial
{
public interface IGreeter
{
string Greet();
}
}
namespace DependencyInjectionTutorial
{
public class Greeter : IGreeter
{
public string Greet()
{
return "Greetings from Greeter!";
}
}
}
接下来,我们需要设置 Startup
类,该类将用于在应用程序中注册我们的服务。 注册服务时,您可以从三种主要的服务生命周期类型中进行选择。
- 瞬态 - 每次从服务容器请求时,都会创建您的服务的实例。 建议用于轻量级、无状态的服务。
- 范围 - 每个客户端请求(连接)创建一个服务。
- 单例 - 单例服务在首次请求时创建,然后每个后续请求都使用相同的实例。
出于本示例的目的,我将使用瞬态服务生命周期,因为我希望在每次调用我的函数时都创建一个 Greeter
的实例。
using DependencyInjectionTutorial;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(Startup))]
namespace DependencyInjectionTutorial
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddTransient<IGreeter, Greeter>();
}
}
}
最后,我们需要通过使用构造函数注入来调整我们的 HTTP 函数以使用我们的 Greeter
服务,这意味着我们还需要将我们的函数转换为非静态的。
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
namespace DependencyInjectionTutorial
{
public class DependencyInjectionTutorialFunction
{
private readonly IGreeter _greeter;
public DependencyInjectionTutorialFunction(IGreeter greeter)
{
_greeter = greeter;
}
[FunctionName("DependencyInjectionTutorialFunction")]
public IActionResult Run([HttpTrigger(AuthorizationLevel.Function,
"get", "post", Route = null)]HttpRequest req, ILogger log)
{
var greeting = _greeter.Greet();
log.LogInformation($"Got Greeting: {greeting}");
return new OkObjectResult(greeting);
}
}
}
要测试我们的函数,请使用函数 CLI 运行以下命令,并在浏览器中导航到终端中提供的链接。
func host start
如果您看到一条带有“Greetings from Greeter!
”的消息,则表示我们服务的依赖注入已正确配置。 干得好!
总结
使用 Microsoft.Azure.Functions.Extensions
包提供的依赖注入功能意味着我们可以轻松地生成可维护、可测试且易于重构的代码。 如果您需要更多关于在 Azure functions 中实现 DI 的信息,请查看官方 Microsoft 页面 这里。如果您有任何问题,请使用本文的评论区或 Twitter 与我联系,我将很乐意提供帮助。
历史
- 2019 年 6 月 6 日:初始版本