大家好,我是Edison。
之前工作中需要用到MongoDB的事務操作,因此參考了一些資料封裝了一個小的元件,提供基礎的CRUD Repository基礎類別 和 UnitOfWork工作單元模式。但是,我一直都沒有把它正式釋出到Nuget倉庫中,近日抽空把釋出了,大家可以搜到它並使用了。
EdisonTalk.MongoProxy可以提供以下幾個重要功能:
比如我們在appsettings中填寫如下設定,通過提供的擴充套件方法可以快速註冊和MongoDB的連線使用者端。這個設定項兼顧了普通賬號使用者名稱 以及 SSL證書驗證模式。
"MongoDatabaseConfigs": { "Servers": "xxx01.edisontalk.net,xxx02.edisontalk.net,xxx03.edisontalk.net", "Port": 27017, "ReplicaSetName": "edt-replica", "DatabaseName": "EDT_Practices", "UserName": "xxxxxxxxxxxxx", "Password": "xxxxxxxxxxxxx", "UseTLS": true, // default: false "AllowInsecureTLS": true, // default: true "SslCertificatePath": "/etc/pki/tls/certs/EDT_CA.cer" // default: null }
針對MongoDB封裝了MongoRepositoryBase的介面和實現,針對單檔案的CRUD都無需再自己實現,只需整合基礎類別即可實現單檔案的CRUD。
針對MongoDB封裝了UnitOfWork操作,針對多檔案的事務操作,使用該模式可以方便實現。
在日常使用中,我們會用到基於組態檔構造MongoDB連線字串的場景。比如,在CAP專案中,如果我們用到MongoDB作為儲存,那麼就需要提供MongoDB連線字串,因此基於標準設定項,我們提供了一個MongoDbConnUtil類用於構造連線字串。
下面展示了CAP整合MongoDB使用MongoDbConnUtil的GetMongoDbConnectionString方法來構造:
option.UseMongoDB(option => { option.DatabaseConnection = MongoDbConnUtil.GetMongoDbConnectionString(config); ...... });
預備步驟:安裝元件
PM> NuGet\Install-Package EdisonTalk.MongoProxy -Version 0.0.6
第一步:注入MongoProxy核心部分
在appsettings中設定MongoDB的連線資訊:
"MongoDatabaseConfigs": { "Servers": "xxx01.edisontalk.net,xxx02.edisontalk.net,xxx03.edisontalk.net", "Port": 27017, "ReplicaSetName": "edt-replica", "DatabaseName": "EDT_Practices", "UserName": "xxxxxxxxxxxxx", "Password": "xxxxxxxxxxxxx" }
然後通過擴充套件方法注入MongoProxy相關部分:
builder.Services.AddMongoProxy(builder.Configuration);
第二步:新增Entity 和 Repository
範例Entity:這裡的Table標籤需要指名你的集合名字,元件會自動對映上對應集合!
[Table("Orders")] public class OrderEntity : MongoEntityBase { public string OrderNumber { get; set; } public List<TransmissionEntity> Transmissions { get; set; } }
範例Repository:
public interface ITodoItemRepository : IMongoRepositoryBase<TodoItem> { } public class TodoItemRepository : MongoRepositoryBase<TodoItem>, ITodoItemRepository { public TodoItemRepository(IMongoDbContext mongoDbContext) : base(mongoDbContext) { } } services.AddScoped<ITodoItemRepository, TodoItemRepository>();
第三步:使用Repository 和 UnitOfWork
# 非事務模式 await _taskRepository.AddManyAsync(newTasks); # 事務模式(藉助UnitOfWork工作單元) private readonly IUnitOfWork _unitOfWork; public OrderService(IUnitOfWork unitOfWork, ......) { _unitOfWork = unitOfWork; ...... } public async Task Example() { using var session = await _unitOfWork.BeginTransactionAsync()) await _taskRepository.AddManyAsync(newTasks, session); await _orderRepository.AddAsync(newOrder, session); await _unitOfWork.SaveChangesAsync(session); }
歡迎大家使用這個元件,我也會持續更新和完善。
GitHub:https://github.com/Coder-EdisonZhou/EdisonTalk.MongoProxy
Nuget:https://www.nuget.org/packages/EdisonTalk.MongoProxy