Client <-> Server(Inspired by SignalR)
.NET/Unity向けのクライアントを自動生成して型付きで通信
完全非同期、戻り値はIObservableで生成(UniRxでハンドリング可能)
[Hub(0)]
public class MyHub : Hub
{
[Operation(0)]
public int Sum(int x, int y)
{
return x + y;
}
}
var peer = new ObservablePhotonPeer(ConnectionProtocol.Tcp);
peer.CreateTypedHub<MyHub>().Invoke.SumAsync(5, 10)
.Subscribe(sum => { }); // 15
Server <-> Server(Inspired by Orleans)
[Hub(0)]
public class MyServerHub : ServerHub
{
[Operation(0)]
public virtual async Task<int> SumAsync(int x, int y)
{
return x + y;
}
}
var results = await PeerManager.GetServerHubContext<MyServerHub>()
.Peers.Single.SumAsync(1, 10);
メソッド呼び出しをネットワーク経由
の呼び出しに動的に置換してサーバー
間通信をメソッド呼び出しで表現
Expression Tree is still alive
Roslyn or Not
Expression Treeによるデリゲート生成は2015年現在でも第一級で、
最初に考えるべき手段
比較的柔軟で、比較的簡単に書けて、標準で搭載されている
有意義なので積極的に使っていって良い
ただし使えない局面もある(スライドの後で紹介)ので
その場合は当然他の手段に譲る
クライアント-サーバー間の通信
[Hub(0)]
public class MyHub : Hub
{
[Operation(0)]
public int Sum(int x, int y)
{
return x + y;
}
}
var peer = new ObservablePhotonPeer(ConnectionProtocol.Tcp);
peer.CreateTypedHub<MyHub>().Invoke.SumAsync(5, 10)
.Subscribe(sum => { }); // 15
呼び出すクラス名・メソッド名・引数の名
前・引数の型・戻り値の型をサーバー/クラ
イアントの双方で合わせなければならない
Share Interface between Server and Client
XML proto DSLJson
Server Code
Client Code
IDL(Interface Definition Language)
共通定義ファイルからサーバーコード/クライア
ントコードの雛形を生成することで、サーバー/
クライアントでのコード手動定義を避けれると
いう一般的パターン
Share Interface between Server and Client
XML proto DSLJson
Server Code
Client Code
IDL(Interface Definition Language)
本来のプログラムコードと別に定義するのは
面倒くさい&ワークフロー的にも煩雑
Generate Client Code from Server Code
Server Code
Client Code
Generate
[Operation(2)]
public async Task<string> Echo(string str)
public IObservable<System.String> EchoAsync(System.String str)
{
byte opCode = 2;
var parameter = new System.Collections.Generic.Dictionary<byte, object>();
parameter.Add(ReservedParameterNo.RequestHubId, hubId);
parameter.Add(0, PhotonSerializer.Serialize(str));
var __response = peer.OpCustomAsync(opCode, parameter, true)
.Select(__operationResponse =>
{
var __result = __operationResponse[ReservedParameterNo.ResponseId]
return PhotonSerializer.Deserialize<System.String>(__result);
});
return __response;
}
.NET DLL is IDL
サーバー実装からジェネレート
C#/Visual Studioの支援が効く(使える型などがC#の文法に則る)
サーバー側を主として、テンプレートではなく完成品から生成
クライアントは大抵通信を投げるだけなのでカスタマイズ不要
自動生成に伴うワークフローで手間になる箇所がゼロになる
Code vs DLL
Roslynの登場によりC#コードの解析が比較的容易になった
とはいえアセンブリとして組み上がったDLLのほうが解析は容易
というわけでデータを読み取りたいだけならDLLから取得する