29. Lightweight Server and Client
// http://hogehoge/Hello/GetMC?name={0}&x={1}&y={2}&e={3}
// と、呼べるサーバーAPIが公開される
public class Hello : LightNode.Server.LightNodeContract
{
public MyClass GetMC(string name, int x, int y, MyEnum e)
{
return new MyClass { Name = name, Sum = (x + y) * (int)e };
}
}
// こう呼べるクライアントが自動生成される
var client = new LightNodeClient("http://hogehoge/")
var mc = await client.Hello.GetMCAsync("hoge", 20, 20, MyEnum.B);
メソッドを作れば、それがそのまま
APIとして公開され、戻り値は
(JSONなどに)シリアライズされる
T4による自動生成、APIのDLLを指定する
ことにより、それを解析してHttpClient
ベースの専用クライアントを生成する
41. ValueProvider
リクエストからModelBinderに渡す文字列を作る
?x=10&y=20だったら{x:”10”, y:”20”}を作る
ValueProvider.cs | ValueProvider.ctor
var queryString = environment["owin.RequestQueryString"] as string;
AppendValues(queryString);
if (verb != AcceptVerbs.Get)
{
using (var sr = new StreamReader((environment["owin.RequestBody"] as Stream)
{
var formUrlEncoded = sr.ReadToEnd();
AppendValues(formUrlEncoded);
}
}
QueryStringと
FormUrlEncodedのみ対応
42. TypeBinder
単純にTryParseするだけ
クソ単純 = わかりやすい = 速い = 正義
TypeBinder.cs | TypeBinder.cctor
public delegate bool TryParse(string x, out object result);
static readonly Dictionary<Type, TryParse> convertTypeDictionary
= new Dictionary<Type, TryParse>(33)
{
{typeof(Boolean) ,(string x, out object result) => { Boolean @out; var success = Boolean.TryParse(x, out @out); result = (object)@out; return success; }},
{typeof(Nullable<Boolean>),(string x, out object result) => { Boolean @out; result = Boolean.TryParse(x, out @out) ? (object)@out : null; return true; }},
{typeof(Int32) ,(string x, out object result) => { Int32 @out; var success = Int32.TryParse(x, out @out); result = (object)@out; return success; }},
{typeof(Nullable<Int32>),(string x, out object result) => { Int32 @out; result = Int32.TryParse(x, out @out)? (object)@out:null; return true; }},
// snip....
}
out付きは汎用デリゲート
にないので手作りする