私はF#ライブラリにアクセスするために使用するC#Web APIを持っています。返すタイプのDUを作成し、どのパターンマッチングを使用してC#コントローラに戻ってくるかを選択しました。C#でF#タイプを操作する
C#コントローラでは、関数呼び出しからF#ライブラリへの戻り値のデータにどのようにアクセスすればよいですか?
C#コントローラ
public HttpResponseMessage Post()
{
var _result = Authentication.GetAuthBehaviour();
//Access item1 of my tuple
var _HTTPStatusCode = (HttpStatusCode)_result.item1;
//Access item2 of my tuple
var _body = (HttpStatusCode)_result.item2;
return base.Request.CreateResponse(_HTTPStatusCode, _body);
}
F#タイプ
module Types =
[<JsonObject(MemberSerialization=MemberSerialization.OptOut)>]
[<CLIMutable>]
type ValidResponse = {
odata: string;
token: string;
}
[<JsonObject(MemberSerialization=MemberSerialization.OptOut)>]
[<CLIMutable>]
type ErrorResponse = {
code: string;
message: string;
url: string;
}
type AuthenticationResponse =
| Valid of int * ValidResponse
| Error of int * ErrorResponse
F#関数
module Authentication =
open Newtonsoft.Json
let GetAuthBehaviour() =
let behaviour = GetBehaviour.Value.authentication
match behaviour.statusCode with
| 200 ->
let deserializedAuthenticationResponse = JsonConvert.DeserializeObject<Types.ValidResponse>(behaviour.body)
Types.Valid (behaviour.statusCode, deserializedAuthenticationResponse)
| _ ->
let deserializedAuthenticationResponse = JsonConvert.DeserializeObject<Types.ErrorResponse>(behaviour.body)
Types.Error (behaviour.statusCode, deserializedAuthenticationResponse)
ここでは、C#で差別化されたユニオンを扱う方法の例があります。http://stackoverflow.com/questions/23843142/f-discriminated-union-usage-from-c-sharpまた、F#デザインガイドラインによれば、C#で利用可能なAPIから差別化された共用体を隠すことを検討すべきであることを示唆しています。 F#タプルは自動的に適切な 'Tuple <>'型のインスタンスに変換されるので、F#コードから3タプルを簡単に返すことができ、頭痛が少なくなります。 – jpe