簡體   English   中英

將 CouchDB 與 .NET 結合使用

[英]Use CouchDB with .NET

.NET(托管代碼)可以讀寫 CouchDB 嗎?

我想構建我的項目的一部分,使用 CouchDB 進行文檔管理

這是一個遲到的答案,但請查看Hammock 它很活躍,很快就會在幾個項目中投入生產使用,並且正在接收定期更新和修復。 除了基本的對象持久性,Hammock 還為您提供:

  • 真正的POCO。 你甚至不需要“id”屬性; 吊床在內部跟蹤。
  • 對視圖的強大支持,包括一個易於使用的 fluent API,可以生成和執行視圖,並支持創建自定義地圖/減少視圖。
  • 附件支持。
  • 一個通用的Repository<>類,有助於將您的查詢/視圖(即 _Design 文檔)與您的 c# 應用程序代碼結合在一起。 存儲庫負責維護 _design 文檔,這有助於避免 CouchDB 視圖感覺像存儲的 procs
  • 完整的單元測試套件。 這不是原型軟件。

看看SharpCouch實用程序類。

它是 CouchDB HTTP API 的簡單包裝類。

鑒於您通常通過 REST 和 JSON 與 CouchDB 進行通信,我想使用JSON.NET和普通的 WebClient/HttpWebRequest 類來做到這一點不會太難。 我自己沒試過,請注意...

是的。

有關在 Windows 上安裝 CouchDB 的說明,請參見此處

這是C# wiki 文章入門的鏈接。 那篇文章中有一個指向 .Net 包裝器的鏈接。 自己動手也很容易。

游戲有點晚了,但是有一個開源項目,用於在異步 HTTP 客戶端上用 C# 編寫的新驅動程序,默認情況下,Newtonsoft 的 JSON.Net 用於序列化(可切換)。 MyCouch - 用於 .Net 的簡單異步 CouchDb 客戶端。

這里有一篇入門文章: http : //danielwertheim.se/get-up-and-running-with-couchdb-and-c-using-mycouch-on-windows/

關注Ottoman一個用 C# 編寫的開源項目。 它仍在大力開發中,但我想指出它是規划階段項目的一個選項。 當它接近完成時,我會更新這篇文章。 您可以在github上查看源代碼。 閱讀自述文件以查看示例以及當前版本的可能性。

  • 與大量使用字符串的 SharpCouch 不同,Ottoman 使用泛型進行自動序列化和反序列化,以便從 JSON 字符串映射對象,反之亦然。 所有這些都不需要您的對象繼承接口或基類。
  • 它在底層使用 Json.Net 來處理 JSON 序列化和反序列化。
  • 將 CouchDB 返回的 RESTFul 錯誤代碼映射到異常中。
  • 計划功能:用於為被持久化的對象生成 Id 的 Id 生成器
  • 計划功能:通過文檔修訂隱式 離線樂觀鎖定,Ottoman 將使用身份地圖為您跟蹤,並在發生沖突時拋出異常。
  • 計划功能:它將與 Mono 兼容。
  • 計划功能:這是在路上,但我確實計划為Map/Reduce 函數使用 LINQ 表達式,您可以使用 JavaScript 向 CouchDB 表達這些函數

這是一個相當新的項目,但非常活躍。 當然,我也有點偏激。 ;-)

還可以看看divan - cdb api 的輕量級包裝器

我已經將 JSON.NET 與 MS REST 入門工具包的 http 客戶端類結合使用,以集成到 CouchDB 中,並且效果非常好。

如果您想要最新狀態,CouchDB 的 wiki 有一個 C# API 列表(及其功能): http : //wiki.apache.org/couchdb/Getting_started_with_C%23

選項(按最新更新排序):

WDK10 中包含的 CouchDB 的 .NET API 非常易於使用,您可以從http://code.google.com/p/skitsanoswdk/獲取它,它非常靈活,允許您處理對象和純 json 級別的數據。

再一個 - CouchDBClient: https : //github.com/ttutisani/CouchDBClient

免責聲明:我是作者。

我試圖讓 CouchDBClient 更友好地使用自定義對象 - 這就是應用程序通常存儲在數據庫中的內容。

當我開始編寫這個框架時,我發現和嘗試的所有其他框架都給人留下了非標准化方法簽名的印象(使用各種約定命名並且更難猜測它們做了什么),而不是統一接口(一些圍繞字符串文檔的操作,而json 文檔周圍的其他人),不是很靈活(有些只使用字符串,有些只使用對象),或者不是很抽象(必須首先了解 CouchDB REST API 才能正確使用它們)。 我假設並希望它們從那時起就成熟了,但至少這個設計符合我的口味。

我希望 CouchDBClient 可以創建一種舒適的抽象感覺,而不必過多擔心底層 API,而只關注您的應用程序,以及它如何存儲和檢索所需的對象。

我知道我很晚了,但也許這對未來有幫助。 在過去的幾年里,我為 CouchDB 開發了一個庫。

最大的特點是將 LINQ(類似於 EF Core)轉換為 mango 查詢,還有 DB Changes Feed、Views 和 Table Splitting。

https://github.com/matteobortolazzo/couchdb-net

var skywalkers = await context.Rebels
    .Where(r => 
        r.Surname == "Skywalker" && 
        (
            r.Battles.All(b => b.Planet == "Naboo") ||
            r.Battles.Any(b => b.Planet == "Death Star")
        )
    )
    .OrderByDescending(r => r.Name)
    .ThenByDescending(r => r.Age)
    .Take(2)
    .Select(
        r => r.Name,
        r => r.Age
    })
    .ToListAsync();

查看放松http://www.sharplearningcurve.com/wiki/Symbiote-Relax.ashx Relax 是“CouchDB 的(優秀的)RESTful API 的.Net API 抽象。它包括用於文檔交互的基於存儲庫的接口和用於管理類型任務的服務器控制器。”

我推薦 CouchDb.Repository.Helper 包。 它是全面的,允許您根據變量的值或對象的屬性解析動態參數,在 XML 文件中創建查詢。

我有同樣的需求,在評估了可用的選項后,為了滿足我的應用程序的要求,我創建了這些對我有很大幫助的組件,也許它們可以幫助你和其他人。 我明確表示我無意在這里宣傳自己,只是分享一些可能有用的東西。

如何配置和使用它的詳細解釋在github上。

鏈接: Nuget 包| GitHub

使用 mango-querie 檢索文檔的示例:

IList<User> users;
var sts = new List<String> { "ACTIVE", "LOCKED" };
using (UserRepository db = new UserRepository())
{
    var query = db.FindOf("list-status", new { id = "OwnerIdloop.user.7", statuses = sts });
    users = db.List<User>(query);
}
Array.ForEach(users.ToArray(), Console.WriteLine);

添加文檔的示例:

User user = createUser("email@email.com");
using (UserRepository db = new UserRepository())
{
    var result = db.Insert<User>(user); // add document and return instance changed with operation revision id
    Console.WriteLine(result.Revision);
}

更改文件的示例:

using (UserRepository db = new UserRepository())
{
    // Load document data by ID
    var user = db.Get<User>("email@email.com");
    user.Name = user.Name + "::CHANGED";

    var result = db.Update<User>(user); // update document and return instance changed with operation revision id
    Console.WriteLine(result.Revision);
}

刪除文檔的示例:

using (UserRepository db = new UserRepository())
{
    // Load document data by ID
    var user = db.Get<User>("email@email.com");

    var result = db.Delete<User>(user); // delete document from database. Return true case sucess or false case not deleted
    Console.WriteLine($"Sucesso: {result}");
}

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM