gpt4 book ai didi

f# - 在 F# 中的模块级别创建私有(private)静态字段

转载 作者:行者123 更新时间:2023-12-04 18:56:38 25 4
gpt4 key购买 nike

我正在尝试创建一个可在 Azure Functions 中沿请求重用的已配置对象。下面的示例是在 C# 中。这个想法是为了避免昂贵的定制 DocumentClient每个请求的实例。 client字段是静态的,在此示例中重用,取自文档:

using System;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;

private static DocumentClient client = GetCustomClient();
private static DocumentClient GetCustomClient()
{
DocumentClient customClient = new DocumentClient(
new Uri(ConfigurationManager.AppSettings["CosmosDBAccountEndpoint"]),
ConfigurationManager.AppSettings["CosmosDBAccountKey"],
new ConnectionPolicy
{
ConnectionMode = ConnectionMode.Direct,
ConnectionProtocol = Protocol.Tcp,
// Customize retry options for Throttled requests
RetryOptions = new RetryOptions()
{
MaxRetryAttemptsOnThrottledRequests = 10,
MaxRetryWaitTimeInSeconds = 30
}
});

// Customize PreferredLocations
customClient.ConnectionPolicy.PreferredLocations.Add(LocationNames.CentralUS);
customClient.ConnectionPolicy.PreferredLocations.Add(LocationNames.NorthEurope);

return customClient;
}

[FunctionName("CosmosDbSample")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "foo/{id}")] HttpRequestMessage req,
string id,
TraceWriter log)
{
Uri documentUri = UriFactory.CreateDocumentUri("ToDoList", "Items", id);
Document doc = await client.ReadDocumentAsync(documentUri);

if (doc == null)
{
return req.CreateResponse(HttpStatusCode.NotFound);
}

return req.CreateResponse(HttpStatusCode.OK, doc);
}

为了尝试用一个更简单的例子来模拟,我尝试了下面的代码。它可以正常工作:
namespace TransactionsAggregate

open Microsoft.AspNetCore.Http
open Microsoft.Azure.WebJobs
open Microsoft.Azure.WebJobs.Host
open Microsoft.Azure.WebJobs.Extensions.Http
open System.Net
open System.Net.Http
open System.Web.Http
open Newtonsoft.Json
open System.Text


module Ping =


type Name = {
First: string
Last: string
}

type Greeting = {
Greeting: string
}


let jsonFormatter = System.Net.Http.Formatting.JsonMediaTypeFormatter()
jsonFormatter.SerializerSettings.ContractResolver <- new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()



[<FunctionName("Ping1")>]
let run([<HttpTrigger>] req: HttpRequest, log: TraceWriter) =
async {

log.Info("Chamando Ping 1")
let! jsonContent = req.ReadAsStringAsync() |> Async.AwaitTask

try
let name = JsonConvert.DeserializeObject<Name>(jsonContent, jsonFormatter.SerializerSettings)

let response = new HttpResponseMessage(HttpStatusCode.OK)
let body = JsonConvert.SerializeObject( { Greeting = sprintf "Hello %s %s!" name.First name.Last })
let content = new StringContent(body, Encoding.UTF8, "application/json")
response.Content <- content
return response

with _ ->
return new HttpResponseMessage(HttpStatusCode.BadRequest)
} |> Async.StartAsTask

在这个 F# 示例中,我们有一个在 V2 版本上运行并在 .NET Core 上编写的 Azure 函数。这是一个预编译函数(不是脚本)。这是一个类库项目。这个例子只是回显了传递的参数。 jsonFormatter在模块级别定义和配置,并且没有标记为静态的。有没有办法创建一个类似的静态字段,这样我就可以缓存这个 jsonFormatter 或者在将来,一个更昂贵的对象?此外,是否可以保证应用程序上只有一个该值的实例?

文档: https://docs.microsoft.com/en-us/sandbox/functions-recipes/cosmos-db

提前致谢

最佳答案

你已经实现了你的目标。 let F# 模块中的绑定(bind)只会在每个 Azure Functions 实例中执行一次,它类似于 C# 中的静态只读字段。

Azure Functions 可以同时和随时间运行多个实例(服务器)。每次配置新实例时,第一次执行会很慢,并且会包括您对昂贵表达式的初始化。但是,在同一实例上的下一次执行将重用它们,因此速度会快得多。

关于f# - 在 F# 中的模块级别创建私有(private)静态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51135301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com