我开始试用Azure功能。我使用的是Visual Studio 2017 Preview 15.3版。当我右键单击我创建的Azure Functions项目,并选择Add> New Item ...> Azure Function时,Visual Studio生成的默认模板是public static class
,其public static async Task
方法(功能)。
该类是否需要是静态的(我将其更改为非静态并且似乎有效)?这是Azure功能的最佳实践吗?如果是这种情况,使用非静态类来保存Azure Function方法可能会出现什么问题?
答案 0 :(得分:2)
鉴于以无服务器方式调用函数,静态方法在此处具有正确的语义。即,假设进程可以在每次函数调用后退出,因此您不应该在函数调用之间的实例方法上累积状态。
那就是说,我们正在调查依赖注入(https://github.com/Azure/azure-webjobs-sdk/issues/1206)
答案 1 :(得分:2)
该类是否需要是静态的(我将其更改为非静态并且似乎有效)?这是Azure功能的最佳实践吗?
静态类只能包含静态成员,并且无法实例化。将类更改为非静态将允许您添加非静态成员并创建此类的实例。
请检查是否需要添加非静态成员并创建此类的实例?由于单一责任原则规定每个班级都应对软件提供的功能的一部分负责,我们建议您创建一个新类并将非静态成员放在那里。
如果是这种情况,使用非静态类来保存Azure Function方法可能会出现什么问题?
我想你想要使用非静态类的原因是你想在类中创建更多的非静态成员。这将使你的课程变得复杂且难以维护。
我的最终答案是认为班级可以改为非静态。为了保持课堂简单,我们建议您保持课堂静态。
答案 2 :(得分:1)
确实需要静态方法。
静态类不是必需的,而是合理的默认值。我不能想出一个不让它静止的好理由,但是如果你有一个 - 没有人阻止你。只要确保它不会让你的队友感到困惑。
答案 3 :(得分:0)
一如既往,这取决于。在保持函数类静态的其他答案中,我想提出另一种情况,其中非静态类可能会有所帮助。 请查看: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();
}
}
但是我不知道这种方法是否安全?是否会有大量要求?