C# 如何为Couchdb HTTP api构造类?

C# 如何为Couchdb HTTP api构造类?,c#,rest,f#,couchdb,C#,Rest,F#,Couchdb,我在试沙发DB api。但是无法为它构造类结构。像艺术家一样,如果我使用类发布,将有名称和相册字段。但在检索时,它将具有_id和_rev字段。现在,可以通过向artist类添加一个字段来处理id,但我需要_rev字段来更新文档 现在,我如何在C/F这样的静态类型语言中实现这一点 如果需要更多信息,请告诉我 \u id是couchdb唯一标识文档的方法。您可以设置它,或者couchdb将在插入文档时设置uuid _rev是couchdb识别文档修订的方式。假设您想向现有文档添加新的详细信息,您必须

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

现在,我如何在C/F这样的静态类型语言中实现这一点


如果需要更多信息,请告诉我

\u id是couchdb唯一标识文档的方法。您可以设置它,或者couchdb将在插入文档时设置uuid

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

我将使用decorator模式实现这一点:


您的域模型将有一个包含相册中所有内容的相册类。您的数据访问层可以添加一个装饰器来存储_id和_rev。若您将一个文档存储到数据库中,那个么若您的对象并没有实现couchdb装饰器,您将知道要生成(或让couchdb生成)一个新的_id。如果实现了decorator,您可以从中访问_id和_rev。当从沙发加载对象时,只需将其设置为装饰并包含这些细节

\u id是couchdb唯一标识文档的方法。您可以设置它,或者couchdb将在插入文档时设置uuid

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

我将使用decorator模式实现这一点:

您的域模型将有一个包含相册中所有内容的相册类。您的数据访问层可以添加一个装饰器来存储_id和_rev。若您将一个文档存储到数据库中,那个么若您的对象并没有实现couchdb装饰器,您将知道要生成(或让couchdb生成)一个新的_id。如果实现了decorator,您可以从中访问_id和_rev。当从沙发加载对象时,只需将其设置为装饰并包含这些细节

对于类似的需求(),我使用了“数据访问对象”模式

以下是其伪代码结构:

  • Class数据库
    • constructor(baseURL)
    • get(id):JSONObject
    • put(JSONObject)
    • delete(JSONObject)
注意:
JSONObject
用于
delete
,因为您需要
\u id
\u rev

在上层,您可以定义业务类,其中一些方法使用“保留”属性,而另一些方法允许访问“自由”属性

例如:

  • 职业艺术家
    • getName():字符串
    • getFreeAttributes():JSONObject
    • 对于类似的需求(),我使用了“数据访问对象”模式

      以下是其伪代码结构:

      • Class数据库
        • constructor(baseURL)
        • get(id):JSONObject
        • put(JSONObject)
        • delete(JSONObject)
      注意:
      JSONObject
      用于
      delete
      ,因为您需要
      \u id
      \u rev

      在上层,您可以定义业务类,其中一些方法使用“保留”属性,而另一些方法允许访问“自由”属性

      例如:

      • 职业艺术家
        • getName():字符串
        • getFreeAttributes():JSONObject

      要快速入门,您可能需要看看MyCuch-用于.NET的异步CouchDb-

      这里有一篇入门文章(关于专辑和艺术家):

      在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);
      

      希望能有所帮助。

      要快速入门,您可能需要看看MyCuch-用于.NET的异步CouchDb-

      这里有一篇入门文章(关于专辑和艺术家):

      在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);
      

      希望能有所帮助。

      我不确定您需要哪一部分的示例,而且内容太多,无法涵盖整个问题。这是一个关于如何映射的好例子。如果然后使用添加_id和_rev的属性,以及当要将对象持久化到内存中时,如果对象在内存中过期,则更新该对象的行为。最后,你可以看看_rev是如何使用的。我不确定你需要哪一部分的例子,而且有太多的元素来涵盖整个问题。这是一个关于如何映射的好例子。如果然后使用添加_id和_rev的属性,以及当要将对象持久化到内存中时,如果对象在内存中过期,则更新该对象的行为。最后,您可以查看以了解_rev是如何使用的。我尝试了MyTouch,但在更新实体时遇到错误:(什么错误?您是否包含必需的rev和id成员?抱歉,我忘记回答…正在度假。我今天将执行此操作并在github上提交错误。我尝试了MyTouch,但在更新实体时遇到错误。:(什么错误?您是否包含必需的rev和id成员?抱歉,我忘记回答。)