在没有 XML 配置的情况下使用 ImageResizer.net 加载 Autorotate 插件的最佳方式

Best way to load the Autorotate plugin using ImageResizer.net without XML config

我正在使用以下方法调整图像大小:

public interface IImageService
{
    byte[] ResizeImage(byte[] imageBytes, ImageFormat format, int thumbnailWidth = 150, bool autoRotate = false);
}

public ImageService : IImageService
{

    public byte[] ResizeImage(byte[] imageBytes, ImageFormat format, int thumbnailWidth = 150, bool autoRotate = false)
    {
        byte[] outputBytes = null;
        using (var outStream = new MemoryStream())
        {
            new ImageResizer.Plugins.Basic.AutoRotate().Install(Config.Current);
            var r = new ResizeSettings { Width = thumbnailWidth, Quality = 90, Mode = FitMode.Max };
            r.Add("autorotate", "true");
            ImageBuilder.Current.Build(imageBytes, outStream, r);
            outputBytes = outStream.ToArray();
        }

        return outputBytes;
    }

}

代码有效,但 API 让我的代码看起来不愉快,即行:

new ImageResizer.Plugins.Basic.AutoRotate().Install(Config.Current);

和:

ImageBuilder.Current.Build(imageBytes, outStream, r);

如您所见,我将整个方法包装在 class 和接口中,这样我就可以在没有这些依赖项的情况下对我的其他代码进行单元测试,但它看起来仍然很糟糕。

有更好的方法吗?

SOLID原则的角度来看,你所做的看起来不错,因为:

  • 这个 class 有一个单一的责任,保持 class 小和可维护,从而遵守 Single Responsibility Principle
  • 由于定义了接口,您可以添加诸如缓存之类的横切关注点,而不必同时更改此实现和消费者,从而遵循 Open/Closed Principle.
  • 您将接口定义为窄的(一种方法)并且其 API 以对消费者有用的方式描述(而不是复制外部库的 API),您可以有效地从应用程序的核心部分隐藏外部库,从而遵守 Interface Segregation Principle.
  • 由于您定义了一个不指定有关给定实现的任何细节的抽象,因此您可以轻松地测试应用程序并允许您交换实现而无需对客户端进行任何更改,甚至允许您单独部署实施 - 如果您愿意,这意味着您遵守 Dependency Inversion Principle.

所以从设计和可维护性的角度来看,我会说你做的非常好。

您对此 class 中的代码有些担忧。我在这里没有看到问题。是的,我同意,ImageResizer 公开的 API 很丑陋,但是您对此无能为力 - 也不应该做。您已经从您的应用程序中优雅地抽象出这个丑陋的 API 。您的接口是端口,ImageService 是您的应用程序和 ImageResizer 之间的 the adapter。所以它必须处理 ImageResizer API。你可以尝试再次抽象掉它,但这会很奇怪,只会导致代码更复杂,因为你会期望这个 class 是系统中唯一需要依赖的 class在 ImageResizer 上。

不过,我觉得奇怪的是 new AutoRotate().Install(Config.Current) 调用;特别是在每次通话时都这样做!我对 ImageResizer 一无所知,所以这可能是需要的,但我的第一直觉是将这段代码移动到静态构造函数,以允许它在应用程序域中只被调用一次。