gpt4 book ai didi

asp.net-core - 在 F# 中使用 `IHttpClientFactory` 的常规方法是什么?

转载 作者:行者123 更新时间:2023-12-04 10:40:32 24 4
gpt4 key购买 nike

因此,在 C# .NET Core 应用程序中,我可以使用所有 fancy DI stuff缓存 HttpClient这样我就可以避免套接字耗尽,优化与服务器的连接等等:

services.AddHttpClient<IRandomService, RandomService>();

现在在 F#... 我只是在控制台应用程序中有一个简单的函数,它检查 url 的有效性并针对不同的 url 循环:

let isReachable (url: string) = 
(new HttpClient()).GetAsync(url)
|> Async.AwaitTask
|> Async.RunSynchronously
|> fun response -> response.IsSuccessStatusCode

我知道我可以将接口(interface)和状态以及所有 OOP 带到这里,但大师 don't encourage这样的想法,所以我只是想知道是否有一些完全不同的 super 功能方法。

最佳答案

规范答案 :通常,如果您想重用/缓存某些内容,则可以将其作为参数传递给您的函数:

let isReachable' (client: HttpClient) url = 
client.GetAsync(url) |> ...
注意函数名称后面的勾号。这是故意的,因为我会像这样部分应用它:
let oneTrueHttpClient = new HttpClient()
let isReachable = isReachable' oneTrueHttpClient
从而找回我原来的 isReachable具有一个参数的函数,但现在所有调用都使用 HttpClient 的相同实例.
此部分应用程序将在程序启动时完成,然后 isReachable函数将作为参数传递给任何需要它的人。
当然,您可能希望有一个 HTTP 客户端池,每个线程一个或类似的东西。在这种情况下,您将使用工厂函数而不是实例本身:
let isReachable' (getClient: unit -> HttpClient) url = 
getClient().GetAsync(url) |> ...

// And later:
let clientFactory () = magic.MakeClient() // <- insert caching behavior here
let isReachable = isReachable' clientFactory

实用答案 : 但是,当然,上面的扩展性不好。比如现在谁需要使用 isReachable不能直接从静态上下文中调用它,他们必须从调用它们的人那里获取它作为参数,依此类推。不过,这并不意味着您必须在任何地方都通过隧道。您可以部分应用可以在程序初始化时部分应用的所有内容。这等效于手动实现 IoC 容器,除了指定 container.Add<IHttpClient, HttpClient>或者其他什么,你正在传递函数。
这是可行的。我已经做了。但随着时间的推移,它确实变得有点难看。
所以 实用答案是:宗教是为了精神成长,其他一切都使用常识。
完全可以偏离神圣的功能原则并使用 IoC 容器、接口(interface)或其他任何东西。毕竟,接口(interface)是 F# 实现更高等级行为的唯一机制,为什么不呢?
尤其如此,因为大多数“框架”(如 WPF、ASP.NET 等)本质上都是面向对象的,因此您会无缘无故地试图避免这种情况。

我个人采用的一般规则是:尽可能清晰和纯粹地以函数式风格表达您的实际业务逻辑,但在与外界(即操作系统或您正在使用的任何框架)的边界处,请随意做外界期望您做的任何事情。
应用于您的特定示例, isReachable功能很明显属于与外界的界限。因此,请随意以任何适合的方式实现它。

关于asp.net-core - 在 F# 中使用 `IHttpClientFactory` 的常规方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59954275/

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