Azure函数-函数应在静态类中编写

bjd*_*321 7 c# azure azure-functions

我开始尝试Azure功能。我正在使用Visual Studio 2017预览版15.3。右键单击我创建的Azure Functions项目,然后选择“添加”>“新建项目...”>“ Azure函数”时,Visual Studio生成的默认模板public static class带有public static async Task方法(该函数)。

该类是否需要为静态的(我将其更改为非静态的,并且似乎可以工作)?这是Azure功能的最佳实践吗?如果是这种情况,使用非静态类来保存Azure Function方法可能会出现什么问题?

kry*_*pru 19

一如既往,这取决于。在保持函数类静态的其他答案中,我想提出另一种非静态类可以提供帮助的情况。请看:函数依赖注入。如果你想在你的函数中使用 DI,那么使用静态类没有简单的方法,因为它不能有带参数的实例构造函数。所以你不能写这样的东西:

public class HttpTrigger
{
    private readonly IMyService _service;
    private readonly HttpClient _client;

    public HttpTrigger(IMyService service, IHttpClientFactory httpClientFactory)
    {
        _service = service;
        _client = httpClientFactory.CreateClient();
    }

    [FunctionName("GetPosts")]
    public async Task<IActionResult> Get(
        [HttpTrigger(AuthorizationLevel.Function, "get", Route = "posts")] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
        var res = await _client.GetAsync("https://microsoft.com");
        await _service.AddResponse(res);

        return new OkResult();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,这绝对是安全的。每个请求实例化一个类不是问题。我认为这被认为是 Azure Functions 的最佳实践。 (4认同)

Mik*_*e S 6

鉴于函数是以无服务器方式调用的,静态方法在这里具有正确的语义,即,您应该假设进程可以在每次函数调用后退出,因此您不应该在函数调用之间累积实例方法的状态。

也就是说,我们正在研究依赖注入


Amo*_*mor -6

该类是否需要是静态的(我将其更改为非静态,它似乎可以工作)?这是 Azure 函数的最佳实践吗?

静态类只能包含静态成员,并且不能实例化。将类更改为非静态将允许您添加非静态成员并创建此类的实例。

请检查是否需要向此类添加非静态成员或创建此类的实例。由于单一职责原则规定每个类都应该对软件提供的功能的单个部分负责,因此我建议您创建一个新类并将非静态成员放在那里。

如果是这种情况,使用非静态类来保存 Azure Function 方法可能会出现什么问题?

我想您想要使用非静态类的原因是您想在其中创建一些非静态成员。这样做会使您的类变得复杂且难以维护。

我最终的答案是可以将类改为非静态的。为了保持类简单,我建议你保持类静态。

  • _我想您想要使用非静态类的原因是您想在类中创建更多非静态成员。它将使你的类变得复杂且难以维护。_可能不会,也绝对不会。记住实例中的状态不会自动使代码变得复杂。静态类和方法本身通常更难以进行单元测试,并且可以使使用它们的实例**显着**更难以进行单元测试。 (17认同)
  • @amor 这没有回答问题。您尚未解决与 Azure Functions 相关的静态与实例的关键细节。 (2认同)