2

上下文:我正在使用 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
}

它正在工作,但感觉有点脏。有没有更好的方法来做到这一点?

感谢您的见解。

4

0 回答 0