如何为Couchdb HTTP api构造类?

时间:2014-05-01 06:23:42

标签: c# rest f# couchdb

我正在尝试Couch DB api。但是无法为它构造类结构。喜欢艺术家,如果我使用类发布将有名称和专辑字段。但是在检索它时,它将具有_id和_rev字段。现在,可以通过向艺术家类添加一个字段来处理id,但我需要_rev字段来更新文档。

现在,我怎么能用C#/ F#这样的静态类型语言呢?

如果需要进一步的信息,请告诉我。

3 个答案:

答案 0 :(得分:3)

_id是couchdb唯一标识文档的方式。您可以设置它,或者在插入文档时,couchdb将设置一个uuid。

_rev是couchdb识别文档修订版的方法。假设您要向现有文档添加新详细信息,则必须告诉couchdb您用于更新文档的修订版本。如果对同一文档进行了其他更改,则您的更新将被拒绝。

我将使用装饰器模式实现这个:

您的域名模型将包含相册类,其中包含相册中的所有内容。您的数据访问层可以添加存储_id和_rev的装饰器。如果将文档存储到数据库,如果对象未实现couchdb_decorator,您将知道生成(或让couchdb生成)新的_id。如果实现了装饰器,您可以从中访问_id和_rev。从沙发中加载对象时,只需将其设置为装饰并包含这些详细信息即可。

答案 1 :(得分:1)

对于类似的需求(in Java),我使用了"数据访问对象"图案。

这是伪代码中的结构:

  • Class RESTDatabase
    • constructor(baseURL)
    • get(id): JSONObject
    • put(JSONObject)
    • delete(JSONObject)

注意:JSONObject使用delete,因为您需要_id_rev

在上层,您可以定义业务类,其中一些方法使用" reserved"属性,以及其他允许访问" free"属性。

例如:

  • Class Artist
    • getName(): string
    • getFreeAttributes(): JSONObject

答案 2 :(得分:0)

要快速入门,您可能需要查看MyCouch - 用于.NET的异步CouchDb - https://github.com/danielwertheim/mycouch

这里有一篇入门文章(关于专辑和艺术家):http://danielwertheim.se/get-up-and-running-with-couchdb-and-c-using-mycouch-on-windows/

在Wiki中查看有关如何入门的信息,但基本上是:

using(var client = new MyCouchClient("http://localhost:5984/mydb")) {
    var putJsonResponse = await client.Documents.PutAsync(...json...);

    var putEntityResponse = await client.Entities.PutAsync(myEntity);
}

您只需为适合您的域的实体建模:

public class Artist
{
    public string ArtistId { get; set; }
    public string ArtistRev { get; set; }

    public string Name { get; set; }
    public Album[] Albums { get; set; }
}

public class Album
{
    public string Name { get; set; }
    public int Tracks { get; set; }
}

使用客户端根据上述存储模型:

var artist = new Artist
{
    ArtistId = "5",
    Name = "Foo bar",
    Albums = new[]
    {
        new Album { Name = "Hello world!", Tracks = 9 }
    }
};

var response = await db.Entities.PutAsync(artist);

希望它有所帮助。