かなり曖昧なタイトルの謝罪ですが、私が達成しようとしていることはおそらくコードでよりよく述べられています。C#:メソッド呼出しを包む優雅な方法
私はWCFクライアントを持っています。私がメソッドを呼び出すときには、エラー処理コードで各呼び出しをラップしたいと思います。だから、代わりに直接メソッドを公開するのは、私はクライアントクラスに、次のヘルパー関数を作成しました:pingに
service.HandleServiceCall(channel => channel.Ping("Hello"));
そしてコール:
public T HandleServiceCall<T>(Func<IApplicationService, T> serviceMethod)
{
try
{
return serviceMethod(decorator);
}
[...]
}
そして、クライアントコードはこのようにそれを使用していますエラーを処理しようとするロジックに素早くラップされます。
これは、サービスで実際に呼び出されているメソッドを知る必要があることを除いて、素晴らしいことです。最初は、表現木を使用してFunc<IApplicationService, T>
を検査するだけで、あまり遠くまでは行かないことを期待していました。
は最後に、私はDecoratorパターンに落ち着い:
public T HandleServiceCall<T>(Func<IApplicationService, T> serviceMethod)
{
var decorator = new ServiceCallDecorator(client.ServiceChannel);
try
{
return serviceMethod(decorator);
}
[...]
finally
{
if (decorator.PingWasCalled)
{
Console.Writeline("I know that Ping was called")
}
}
}
そして、デコレータ自体:
private class ServiceCallDecorator : IApplicationService
{
private readonly IApplicationService service;
public ServiceCallDecorator(IApplicationService service)
{
this.service = service;
this.PingWasCalled = new Nullable<bool>();
}
public bool? PingWasCalled
{
get;
private set;
}
public ServiceResponse<bool> Ping(string message)
{
PingWasCalled = true;
return service.Ping(message);
}
}
それは本当に不格好とコードのかなり多くのです。 これを行うもっとエレガントな方法はありますか?
どこでデコレータを作成しますか? – smartcaveman
エクスプレッションツリーは移動する方法です。コードを表示して問題の内容を教えてください。 –
PostSharpの仕事のように聞こえます。 – geofftnz