包装 API 以支持依赖注入

2024-04-21

我正在与一个只有静态函数的 API 进行交互,并且无法打开和更改。

    public class WindowsNativeGraphAPI
    {
        public static IEnumerable<IGraphData> GetGraphData();
        public static bool DeleteGraphData(IGraphData data);
    }

我希望能够将 API 传递到函数或构造函数中并遵守依赖项注入(以防万一我们稍后要交换 API)。

public void GatherGraphData(IGraphAPI api)
{...}

为了允许这个 API 作为参数传入,我至少需要抽象为使用一个接口来传入函数。

    public interface IGraphAPI
    {
        IEnumerable<IGraphData> GetGraphData();
        bool DeleteGraphData(IGraphData data);
    }

但是,我需要在另一个类中实现该接口,因为我无法更改原始 API。此类将是 API 的轻量级包装器,仅调用 API 上的相应函数并返回相同的结果。

    public class WindowsGraphAPI : IGraphAPI
    {
        public IEnumerable<IGraphData> GetGraphData()
        {
            return WindowsNativeGraphAPI.GetGraphData();
        }

        public bool DeleteGraphData(IGraphData data)
        {
            return WindowsNativeGraphAPI.DeleteGraphData(data)
        }
    }

我不喜欢创建另一个类来包装 API 的想法。我知道这个包装器非常轻量级,只会返回 API 的结果,但是如何测试包装器?包装器可能还应该包含一些异常处理来处理 API 中的错误。如果我们要更改为另一个遇到同样问题的 API,我们就必须再次创建这些额外的类和接口。

理想情况下,最终结果将是一个可模拟的 API,可以在为使用它的新组件编写单元测试时使用。

这是执行此操作的正确方法吗?可以用其他方式完成吗?

Thanks


是的,这是正确的方法。新的 API 接口和代理类封装了使用哪个底层库的决定 - 单一责任。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

包装 API 以支持依赖注入 的相关文章

随机推荐