件名はすべてを言います: WCF サービスに透過的にアクセスするための安全で汎用的なラッパーを作成しています。
少し背景:
私が行ったことは、サーバーとクライアントの両方で同様のビジネス クラス定義を作成したことです。サーバー側には実際のロジックが含まれ、クライアント側にはメソッド定義のみが含まれます。さらに、クライアント側のクラスは、Call メソッドを実装する SecureFactory から派生します。各派生クラスのすべてのメソッドの本体には、Call メソッドの呼び出しのみが含まれます。この Call メソッドは、サーバー サービスを呼び出して、ビジネス クラスのタイプや、要求された操作を実行するために呼び出すメソッドなどを渡します。このアプローチは、セキュリティ情報の受け渡しを SecureFactory と Server サービスの間のみに制限することで、セキュリティ チェックを簡素化するために設計されています。あなたがすでに知っている他の多くの利点があります。
問題は次のとおりです。サーバーから Call メソッドにオブジェクト (特にオブジェクトの配列) を返す方法に行き詰まっていますか? サーバーは、単一のビジネス オブジェクト (DataContract が適用されている) と、そのようなオブジェクトのリストを返す場合があります。これは一般的なアプローチであるため、戻り値の型として使用するのは Object だけです。以下はCallメソッドです
public object Call(params object[] parameters)
{
var mb = (新しい StackFrame(1).GetMethod());
使用 (Proxy.ServerClient サーバー = 新しい Security.BO.Proxy.ServerClient())
{
試す
{
if (((MethodInfo)mb).ReturnType.IsGenericType)
{
var response = server.InvokeForList(SecurityManager.Current.SID, SecurityManager.Current.Token, mb.DeclaringType.ToString(), mb.Name, parameters);
response.Result.ToList(); を返します。
}
そうしないと
{
var response = server.Invoke(SecurityManager.Current.SID, SecurityManager.Current.Token, mb.DeclaringType.ToString(), mb.Name, parameters);
response.Result を返します。
}
}
キャッチ(例外例)
{
System.Diagnostics.Debugger.Break();
}
}
null を返します。
}
サーバーメソッド:
public CollectionResponse InvokeForList (文字列 SID、文字列トークン、文字列型、文字列メソッド、オブジェクト [] パラメーター)
{
// ここで検証
var t = assemblyBO.GetType(type, true);
オブジェクト BO = Activator.CreateInstance(t);
var mi = t.GetMethod(メソッド);
もし (mi == null)
throw new MethodNotImplementedException("メソッド " + メソッド + " が型 " + t.ToString()) で見つかりませんでした。
オブジェクト res = mi.Invoke(BO, パラメータ);
// リストを t[] に変換します
オブジェクト リスト = res.GetType().GetMethod("ToArray").Invoke(res, 新しいオブジェクト[0]);
//ここでエラー!t[] を object[] に変換できません
新しい CollectionResponse((object[])list); を返します。
}
もう 1 つのメソッド Invoke(...) は、CollectionResponse の代わりに Response オブジェクトを返すのと同様に受け入れます。
CollectionResponse クラスは次のとおりです: (応答は似ています: オブジェクトが 1 つしかないだけです)
【データ契約】
パブリック クラス CollectionResponse
{
[データメンバ]
プライベート オブジェクト[] _結果;
public Object[] 結果
{
得る
{
_結果を返します。
}
}
public CollectionResponse(Object[] 結果)
{
this._result = 結果;
}
}
最初は、リストとシングルトンの両方に 1 つの Invoke だけを使用することを考えていましたが、「予期せず接続が閉じられました」というエラーが表示されて失敗しました。まだ達成できていません-どうすればT []をオブジェクト[]に変換できますか。
それを改善するための提案、または同じことを達成する他の方法はありますか?
ありがとう