A B*_*elp 0 c# f# functional-programming hashicorp-vault language-ext
我正在使用 LanguageExt 来实现 C# 中的函数式编程功能。我有一个方法,我想构建 VaultSharp 实例来访问我们的 HashiCorp Vault 服务。我的目标是通过两个 Either 的链创建 VaultClientSettings 的实例(请参阅下面的方法)。最后,要么从链中的任何 Either 返回异常,要么从 VaultClientSettings 的实例返回异常。我认为我已经很接近了,但无法完成最后一步。我很感激你的建议。
以下是 C# 的 FP 库和 VaultSharp 库的链接;
这是显示我看到的错误的图像:
Either<Exception, Uri> GetVaultUri() =>
EnvironmentVariable.GetEnvironmentVariable(KVaultAddressEnvironmentVariableName)
.Map(uri => new Uri(uri));
Either<Exception, TokenAuthMethodInfo> GetAuthInfo() =>
EnvironmentVariable.GetEnvironmentVariable(KVaultTokenEnvironmentVariableName)
.Map(token => new TokenAuthMethodInfo(token));
Either<Exception, VaultClientSettings> GetVaultClientSettings(
Either<Exception, Uri> vaultUri,
Either<Exception, TokenAuthMethodInfo> authInfo
)
{
/////////////////////////////////////////////////////////////////////////
// I have access to the uri as u and the authmethod as a, but I cannot //
// figure out how to create the instance of VaultClientSettings. //
Either<Exception, VaultClientSettings> settings =
vaultUri.Bind<Uri>(u =>
authInfo.Bind<TokenAuthMethodInfo>(a =>
{
Either<Exception, VaultClientSettings> vaultClientSettings =
new VaultClientSettings(u.AbsoluteUri, a);
return vaultClientSettings;
}));
}
Run Code Online (Sandbox Code Playgroud)
正如@hayden 已经指出的:绑定类型参数是错误的(需要是“正确”的结果类型)。
对于 LanguageExt:如果返回正确的类型,您甚至可以省略类型参数:
Either<Exception, VaultClientSettings> settings =
vaultUri.Bind(u =>
authInfo.Bind(a =>
{
Either<Exception, VaultClientSettings> vaultClientSettings =
new VaultClientSettings(u.AbsoluteUri, a);
return vaultClientSettings;
}));
Run Code Online (Sandbox Code Playgroud)
此代码还有另一种形式 (LINQ),您可能更容易阅读:
var settings = from u in vaultUri
from a in authInfo
select new VaultClientSettings(u.AbsoluteUri, a);
Run Code Online (Sandbox Code Playgroud)
本质上Bind是SelectMany(来自...)