Tôi biết MongoDB không được hỗ trợ đơn vị công việc, v.v. Nhưng tôi nghĩ sẽ tốt hơn nếu triển khai kho lưu trữ chỉ có ý định (tương tự tiêu chí) và sau đó cam kết chúng cho DB. Nếu không, trong mọi phương thức trong kho lưu trữ của bạn, bạn phải tạo kết nối đến DB và sau đó đóng nó lại. Nếu chúng ta đặt kết nối tới DB trong một số lớp BaseRepository, thì chúng ta kết buộc kho lưu trữ của chúng ta với DB cụ thể và thật sự rất khó để kiểm tra các kho lưu trữ, để kiểm tra IoC giải quyết các kho lưu trữ.Đơn vị công việc ở mongodb và C#
Tạo phiên trong MongoDB là một ý tưởng tồi? Có cách nào để tách logic kết nối khỏi kho lưu trữ không?
Đây là một số mã của Rob Conery. Bạn có nên luôn kết nối với DB của mình theo mọi yêu cầu không? Thực hành tốt nhất là gì?
Còn một điều nữa. Hãy tưởng tượng tôi muốn cung cấp một chỉ mục cho một bộ sưu tập. Trước đây tôi đã làm trong một nhà xây dựng nhưng với cách tiếp cận của Rob này có vẻ ngoài logic để làm điều đó ở đó.
using Norm;
using Norm.Responses;
using Norm.Collections;
using Norm.Linq;
public class MongoSession {
private string _connectionString;
public MongoSession() {
//set this connection as you need. This is left here as an example, but you could, if you wanted,
_connectionString = "mongodb://127.0.0.1/MyDatabase?strict=false";
}
public void Delete<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new() {
//not efficient, NoRM should do this in a way that sends a single command to MongoDB.
var items = All<T>().Where(expression);
foreach (T item in items) {
Delete(item);
}
}
public void Delete<T>(T item) where T : class, new() {
using(var db = Mongo.Create(_connectionString))
{
db.Database.GetCollection<T>().Delete(item);
}
}
public void DeleteAll<T>() where T : class, new() {
using(var db = Mongo.Create(_connectionString))
{
db.Database.DropCollection(typeof(T).Name);
}
}
public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new() {
T retval = default(T);
using(var db = Mongo.Create(_connectionString))
{
retval = db.GetCollection<T>().AsQueryable()
.Where(expression).SingleOrDefault();
}
return retval;
}
public IQueryable<T> All<T>() where T : class, new() {
//don't keep this longer than you need it.
var db = Mongo.Create(_connectionString);
return db.GetCollection<T>().AsQueryable();
}
public void Add<T>(T item) where T : class, new() {
using(var db = Mongo.Create(_connectionString))
{
db.GetCollection<T>().Insert(item);
}
}
public void Add<T>(IEnumerable<T> items) where T : class, new() {
//this is WAY faster than doing single inserts.
using(var db = Mongo.Create(_connectionString))
{
db.GetCollection<T>().Insert(items);
}
}
public void Update<T>(T item) where T : class, new() {
using(var db = Mongo.Create(_connectionString))
{
db.GetCollection<T>().UpdateOne(item, item);
}
}
//this is just some sugar if you need it.
public T MapReduce<T>(string map, string reduce) {
T result = default(T);
using(var db = Mongo.Create(_connectionString))
{
var mr = db.Database.CreateMapReduce();
MapReduceResponse response =
mr.Execute(new MapReduceOptions(typeof(T).Name) {
Map = map,
Reduce = reduce
});
MongoCollection<MapReduceResult<T>> coll = response.GetCollection<MapReduceResult<T>>();
MapReduceResult<T> r = coll.Find().FirstOrDefault();
result = r.Value;
}
return result;
}
public void Dispose() {
_server.Dispose();
}
}
Làm thế nào về tiêm phụ thuộc thông qua một khuôn khổ (hoặc tự viết)? – DrColossos
@DrColossos, Thực ra tôi sử dụng một framework có tên Castle.Windsor. Tôi đã nhìn thấy một số mã của Rob Conery mô phỏng phiên nhưng ông kết nối với DB trên mỗi tạo/cập nhật/xóa/tìm kiếm và tôi không nếu nó là tối ưu –