是否有一个存储库抽象出Azure,S3和其他?

时间:2015-04-22 17:27:36

标签: c# azure amazon-web-services amazon-s3 azure-storage

我正在开发一个支持在云端运行的应用程序,无论是亚马逊还是Azure。我需要的组件之一是围绕存储API(Blob和队列)的抽象。我可以编写一个抽象层,但最终仍然有一大堆依赖项(所有Azure和Amazon库)。我想要的是一个提供纯HTTP访问的组件,所以我不需要采取任何外部依赖。这样的野兽存在吗?

修改

到目前为止,我所做的是构建一个抽象blob基本操作的接口。我最终得到的结果类似于以下内容:

public interface IBlobService {
  Task<Stream> DownloadBlob(string container, string blob);
  IEnumerable<string> ListBlobs(string container);
  void PutBlob(string container, string blob, Stream data);
}

据我所知,不同的服务有不同的行为,但都支持一组基本的CRUD操作。我发现的是我不断添加其他方法来改变调用行为。例如,添加到

void PutBlob(string container, string blob, Stream data);

我最终还需要

void PutBlob(string container, string blob, byte[] data);

在两个服务中构建第n个方法之后,我意识到有人必须已经这样做了。鉴于两者都只是各个HTTP接口的包装器,我正在寻找的是一个围绕这些操作提供抽象的库。就HTTP而言,发送字节数组和流之间的区别是零,但每个服务都需要它自己的风格(标题,编码,HMAC等)。

我想要的是类似于ODBC为数据库提供的东西 - 一种提供一组通用功能的API,同时承认支持平台存在差异。我希望这能够缩小这个要求。

谢谢, 埃里克

2 个答案:

答案 0 :(得分:4)

图书馆TwentyTwenty.Storage是blob存储的抽象。它定义了Azure,Amazon S3,Google Cloud存储和本地文件系统的接口和一些实现。 有关项目github的更多信息:TwentyTwenty.Storage

可用于.net 4.5和.net core(netstandard 1.3),可以通过nuget安装。

答案 1 :(得分:0)

这种抽象的一个主要问题是它可能只支持两种服务的最低公分母,而且你的行为可能不一致。例如,Azure非常一致,并且完全支持optimistic concurrency,这在这样的库中很难满足。