上下文:我正在使用 ServiceStack 编写服务。该服务正在调用其他一些远程服务(使用 ServiceStack JsonServiceClient
)。
要求:将对远程服务的每次调用显示为 MiniProfiler 中的一个步骤。
问题:以通用方式实现此功能的最佳方法是什么?
我的服务中的原始代码如下所示:
// Registration of the serviceclient in Apphost.cs:
// container.Register<IRestClient>(x => new JsonServiceClient("http://host:8080/"));
var client = ResolveService<IRestClient>();
HelloResponse response;
using (Profiler.Current.Step("RemoteService: Get Hello"))
{
response = client.Get(new Hello { Name = "World!" });
}
// ... do something with response ...
我想去掉using (Profiler.Current.Step())
这部分代码中的 ,以使其更易于阅读和编写。
// Registration of the serviceclient in Apphost.cs:
// container.Register<IRestClient>(x => new ProfiledRestClient("RemoteService", new JsonServiceClient("http://host:8080/")));
var client = ResolveService<IRestClient>();
HelloResponse response = client.Get(new Hello { Name = "World!" });
// ... do something with response ...
我围绕现有客户端制作了一个包装器,其中包含接口Profiler.Current.Step()
的每个方法的代码,其中IRestClient
提到了客户端的名称、方法和请求(类型)。
// The implementation of the wrapper:
public class ProfiledRestClient : IRestClient
{
readonly string clientName;
readonly IRestClient wrappedClient;
public ProfiledRestClient(string clientName, IRestClient wrappedClient)
{
this.clientName = clientName;
this.wrappedClient = wrappedClient;
}
public TResponse Get<TResponse>(IReturn<TResponse> request)
{
using (Profiler.Current.Step("{0}: Get {1}".Fmt(clientName, request.GetType().Name)))
{
return wrappedClient.Get(request);
}
}
public TResponse Post<TResponse>(IReturn<TResponse> request)
{
using (Profiler.Current.Step("{0}: Post {1}".Fmt(clientName, request.GetType().Name)))
{
return wrappedClient.Post(request);
}
}
// etc. the same for all other methods of IRestClient interface
}
它正在工作,但感觉有点脏。有没有更好的方法来做到这一点?
感谢您的见解。