我使用LanguageExt在C#中具有函数式编程特性。我有一个方法,在这个方法中,我希望构建一个VaultSharp实例来访问我们的HashiCorp Vault服务。我的目标是通过两个参与者链创建一个VaultClientSettings实例(参见下面的方法)。最后,要么从链中的任意一个返回异常,要么从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;
}));
}发布于 2020-07-15 06:45:33
没有使用这两个库,但是查看了Bind的签名
Either<L, B> Bind<B>(Func<R, Either<L, B>> f)
从签名判断,下列内容应有效:
Either<Exception, VaultClientSettings> settings =
vaultUri.Bind<VaultClientSettings>(u =>
authInfo.Bind<VaultClientSettings>(a =>
{
Either<Exception, VaultClientSettings> vaultClientSettings = new VaultClientSettings(u.AbsoluteUri, a);
return vaultClientSettings;
}));发布于 2020-07-15 09:31:25
正如@hayden已经指出的:绑定类型参数是错误的(需要是“正确”的结果类型,无论哪种类型)。
对于LanguageExt:如果返回正确的类型,甚至可以省略类型参数:
Either<Exception, VaultClientSettings> settings =
vaultUri.Bind(u =>
authInfo.Bind(a =>
{
Either<Exception, VaultClientSettings> vaultClientSettings =
new VaultClientSettings(u.AbsoluteUri, a);
return vaultClientSettings;
}));此代码的另一种形式(LINQ)可能更易读:
var settings = from u in vaultUri
from a in authInfo
select new VaultClientSettings(u.AbsoluteUri, a);本质上Bind是SelectMany (来自.)
https://stackoverflow.com/questions/62907947
复制相似问题