【问题标题】:Azure functions - should functions be written inside static classesAzure 函数 - 函数应该写在静态类中
【发布时间】:2017-12-23 10:22:49
【问题描述】:

我开始尝试 Azure 功能。我正在使用 Visual Studio 2017 预览版 15.3。当我右键单击我创建的 Azure Functions 项目并选择 Add>New Item...>Azure Function 时,Visual Studio 生成的默认模板是 public static class 和 public static async Task 方法(函数)。

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

【问题讨论】:

    标签: c# azure azure-functions


    【解决方案1】:

    一如既往,视情况而定。在保持函数类静态的其他答案中,我想介绍另一种非静态类可能有用的情况。 请看:Functions dependency injection。如果你想在你的函数中使用 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();
        }
    }
    

    【讨论】:

    • 是的,绝对安全。每个请求实例化一个类不是问题。在我看来,这被认为是 Azure Functions 的最佳实践。
    【解决方案2】:

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

    也就是说,我们是investigating Dependency Injection。

    【讨论】:

      【解决方案3】:

      确实需要静态方法。

      静态类不是必需的,而是合理的默认值。我想不出一个不让它静止的好理由,但如果你有一个 - 没有人能阻止你。只要确保它不会让你的队友感到困惑。

      【讨论】:

      • 我担心的是,如果我有一个静态类,那么它的所有成员都必须是静态的。然后这样一个静态变量将在对函数(或函数)的不同请求之间共享。所以我会有效地共享状态,而根据这个docs.microsoft.com/en-us/azure/azure-functions/…,函数应该写成无状态的。
      • @bjd54321 是的,所以你的静态类最好没有字段或属性(没有状态),只有方法
      • 好建议,我可能只是补充一点,有一些例外,例如 HttpClient。
      • @robs HttpClient 通常也应该是静态的
      • 是的,当然。我只是稍微误读了你的评论。在这方面,我也很喜欢研究新的 HttpClientFactory。
      【解决方案4】:

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

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

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

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

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

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

      【讨论】:

      • 我想你想使用非静态类的原因是你想在类中创建更多的非静态成员。它会使你的类变得复杂且难以维护。 可能不会,也绝对不会。记住实例中的状态不会自动使代码变得复杂。静态类和方法本身通常更难进行单元测试,并且会使使用它们的实例显着更难进行单元测试。
      • @amor 这没有回答问题。您尚未解决与 Azure Functions 相关的静态与实例的关键细节。
      猜你喜欢
      • 2021-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      相关资源
      最近更新 更多