Wykorzystanie biblioteki LanguageExt

0

Uczę się libki LanguageExt. Mam jednak problem z przekazywaniem wartości między wywołaniami kolejnych funkcji.

Mam taki kod

return await CertificateHelper.GetCertificate()
    .BindAsync(certificate => (CreateDoc(requestId, certificate)))
    .BindAsync(data =>
        SignDoc(data.xmlDocument, data.certificate, data.issuerNode))
    .BindAsync(xmlDoc => _xmlMessageProvider.SendMessage(xmlDoc))
    .MapAsync(xmlDoc => new
    {
        xmlDoc,
        authenticationRequestId = XmlHelper.GetAuthenticationRequestId(xmlDoc)
    })
    .MapAsync(x => new
    {
        extractParameters = XmlHelper.ExtractParameters(x.xmlDoc),
        x.xmlDoc,
        x.authenticationRequestId
    })
    .MapAsync((x) => new
    {
        encryptionCert = CertificateHelper.GetPrivateKey(),
        x.xmlDoc,
        x.authenticationRequestId,
        x.extractParameters
    })
    .MapAsync(x => CryptoHelper.DecryptXml(x.extractDecryptionParameters.Case as AssertionDecryptionParameters,
        x.encryptionCert, "12345"));

Problemem jest to, że np. XmlHelper.ExtractParameters(x.xmlDoc) zwraca Either<Failure, Parameters> I tak jest zapisywany do zmiennej.
Chciałbym jednak, aby działało to w taki sposób, że jeżeli jest Failure to wywala błąd, zaś jeżeli jest wszystko Ok, to zapisuje do zmiennej obiekt Parameters.

Nie chcę zrobić podobnie jak w części

.BindAsync(certificate => (CreateDoc(requestId, certificate)))
    .BindAsync(data =>
        SignDoc(data.xmlDocument, data.certificate, data.issuerNode))

że przekazuje dane (certificate) do funkcji, aby przekazać ją dalej przez funkcję.

2

No to chyba ten XmlHelper.ExtractParameters też musisz jakoś w tym łańcuchu metod wywołać, żeby potem na jego wyniku uruchomić BindAsync. (Zakładam, że BindAsync obsługuje tylko right z Eithera, a failure puszcza dalej.)

0

Ostatecznie udało mi się to rozwiązać w taki sposób

.BindAsync(data => XmlHelper.ExtractParameters(data.xmlDoc)
                .Map(x => new
                {
                    data.xmlDoc,
                    data.authenticationRequestId,
                    extractParameters = x
                }))

@somekind: Dzięki, naprowadziłeś mnie na rozwiązanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1