编写客户端包装器类以隔离其类实现IDisposable但接口不实现的客户端的内部细节

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编写客户端包装器类以隔离其类实现IDisposable但接口不实现的客户端的内部细节相关的知识,希望对你有一定的参考价值。

我正在编写一个在NuGet包中定义的外部客户端的客户端包装器。 NuGet包中包含以下接口和类。

public interface IServiceClient
{
    Task<Job> CreateJobAsync(JobDetails jobdetails);
}

public class ServiceClient : IServiceClient, IDisposable
{
    public async Task<Job> CreateJobAsync(JobDetails jobDetails)
    {   
        // Some processing and returns a job that contains required response and status

        return job;
    }
}

在我的应用程序中,我在服务客户端周围写了一个客户端包装器,如下所示:

public interface IServiceClientWrapper
{
    Task<ResponseDto> PostAsync(RequestDto request);
}

public class ServiceClientWrapper : IServiceClientWrapper
{
    private static IServiceClient serviceClient;

    public static void Init()
    {
        // See below for defintion
        serviceClient = ClientFactory.Create();
    }   

    public async Task<ResponseDto> PostAsync(RequestDto request)
    {
        // Convert request to JobDetails as required

        var job = await serviceClient.CreateJobAsync(jobDetails);

        // Convert job to ResponseDto and return
        return response;
    }

    // Since ServiceClient implements IDisposable
    public static void Close()
    {
        if (serviceClient != null)
        {
            ((ServiceClient)serviceClient).Dispose();
        }
    }
}

internal static class ClientFactory
{   
    public static IServiceClient ServiceClient { get; set; }

    public static IServiceClient Create()
    {
        if (ServiceClient != null)
        {
            // Used during unit testing
            return ServiceClient;
        }

        return new ServiceClient(APIBaseAddress, AccessKey);
    }
}

问题:

  1. 由于接口未标记为IDisposable,因此我引入了Init和Close方法来执行此操作。有没有更好的方法来处理这个?
  2. 将serviceClient作为静态,是否是线程安全的,因为我总是使用每个请求的新参数调用非静态CreateJobAsync方法?
答案

我建议IDisposable是IServiceClientWrapper的具体实现的细节,即ServiceClientWrapper

它不一定是IServiceClientWrapper的一部分,因为理论上你可以实现不需要处理任何东西的实现。

因此,正如评论所示,ServiceClientWrapper应该实现IDisposable。

以上是关于编写客户端包装器类以隔离其类实现IDisposable但接口不实现的客户端的内部细节的主要内容,如果未能解决你的问题,请参考以下文章

Swig C++ to C#:如何从 C++ 包装类以使模板类中的方法在 C# 的派生类中可用?

如何编写一个不断敲击输出的包装器?

创造自己的群集类型----之----创建“包装”类以封装预定义集群类型

C# 应用程序的 WIA/TWAIN 包装器类? [关闭]

使用 SWIG 包装 c++ 类以在 Lua 中使用它 - 需要简单的示例

从Integer包装器类转换为int基本类