Azure 函数 - 函数应该写在 static 类
Azure functions - should functions be written inside static classes
我开始试用 Azure 函数。我使用的是 Visual Studio 2017 预览版 15.3。当我右键单击我创建的 Azure Functions 项目,然后 select 添加>新项目...>Azure 函数时,默认模板 Visual Studio 生成的是 public static class
和 public static async Task
方法(函数)。
class 是否需要是静态的(我把它改成非静态的,它似乎可以工作)?这是 Azure 函数的最佳实践吗?如果是这样,使用非静态 class 来保存 Azure Function 方法可能会出现什么问题?
确实需要静态方法。
静态 class 不是必需的,而是一个合理的默认值。我想不出一个不让它成为静态的好理由,但如果你有一个 - 没有人会阻止你。只要确保它不会让您的队友感到困惑。
鉴于函数是以无服务器方式调用的,静态方法在这里具有正确的语义,即,您应该假设进程可以在每次函数调用后退出,因此您不应该在实例方法上累积状态在函数调用之间。
也就是说,我们是 investigating Dependency Injection。
Does the class need to be static (I changed it to non-static and it seems to work)? Is that a best practice for Azure functions?
静态class只能包含静态成员,不能实例化。将 class 更改为非静态将允许您添加非静态成员并创建此 class 的实例。
请检查您是否需要向此 class 添加非静态成员或创建其实例。由于单一责任原则规定每个 class 都应该对软件提供的功能的单一部分负责,我建议您创建一个新的 class 并将非静态成员放在那里.
If that is the case, what problems might rise by using a non-static class to hold the Azure Function method?
我想你想使用非静态 class 的原因是你想在其中创建一些非静态成员。这样做会使您的 class 复杂且难以维护。
我最后的回答是class可以改成非静态的。为了保持 class 简单,我建议您保持 class 静态。
一如既往地取决于。在保持函数 class 静态的其他答案中,我想提出另一种情况,其中非静态 class 可能会有所帮助。
请看:Functions dependency injection。如果你想在你的函数中使用 DI,那么使用 static class 没有简单的方法,因为它不能有带参数的实例构造函数。所以你不能写这样的东西:
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 函数。我使用的是 Visual Studio 2017 预览版 15.3。当我右键单击我创建的 Azure Functions 项目,然后 select 添加>新项目...>Azure 函数时,默认模板 Visual Studio 生成的是 public static class
和 public static async Task
方法(函数)。
class 是否需要是静态的(我把它改成非静态的,它似乎可以工作)?这是 Azure 函数的最佳实践吗?如果是这样,使用非静态 class 来保存 Azure Function 方法可能会出现什么问题?
确实需要静态方法。
静态 class 不是必需的,而是一个合理的默认值。我想不出一个不让它成为静态的好理由,但如果你有一个 - 没有人会阻止你。只要确保它不会让您的队友感到困惑。
鉴于函数是以无服务器方式调用的,静态方法在这里具有正确的语义,即,您应该假设进程可以在每次函数调用后退出,因此您不应该在实例方法上累积状态在函数调用之间。
也就是说,我们是 investigating Dependency Injection。
Does the class need to be static (I changed it to non-static and it seems to work)? Is that a best practice for Azure functions?
静态class只能包含静态成员,不能实例化。将 class 更改为非静态将允许您添加非静态成员并创建此 class 的实例。
请检查您是否需要向此 class 添加非静态成员或创建其实例。由于单一责任原则规定每个 class 都应该对软件提供的功能的单一部分负责,我建议您创建一个新的 class 并将非静态成员放在那里.
If that is the case, what problems might rise by using a non-static class to hold the Azure Function method?
我想你想使用非静态 class 的原因是你想在其中创建一些非静态成员。这样做会使您的 class 复杂且难以维护。
我最后的回答是class可以改成非静态的。为了保持 class 简单,我建议您保持 class 静态。
一如既往地取决于。在保持函数 class 静态的其他答案中,我想提出另一种情况,其中非静态 class 可能会有所帮助。 请看:Functions dependency injection。如果你想在你的函数中使用 DI,那么使用 static class 没有简单的方法,因为它不能有带参数的实例构造函数。所以你不能写这样的东西:
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();
}
}