以下是一个简化的MongoDB数据仓储和工作单元模式的示例代码:
using MongoDB.Driver;
using System.Threading.Tasks;
// 定义数据仓库接口
public interface IRepository<T>
{
Task<T> GetByIdAsync(string id);
Task AddAsync(T entity);
Task UpdateAsync(string id, T entity);
Task DeleteAsync(string id);
}
// 实现MongoDB数据仓库
public class MongoDbRepository<T> : IRepository<T>
{
private readonly IMongoCollection<T> _collection;
public MongoDbRepository(IMongoDatabase database, string collectionName)
{
_collection = database.GetCollection<T>(collectionName);
}
public async Task<T> GetByIdAsync(string id)
{
return await _collection.Find(entity => entity.Id == id).FirstOrDefaultAsync();
}
public async Task AddAsync(T entity)
{
await _collection.InsertOneAsync(entity);
}
public async Task UpdateAsync(string id, T entity)
{
var filter = Builders<T>.Filter.Eq(e => e.Id, id);
await _collection.ReplaceOneAsync(filter, entity);
}
public async Task DeleteAsync(string id)
{
var filter = Builders<T>.Filter.Eq(e => e.Id, id);
await _collection.DeleteOneAsync(filter);
}
}
// 定义实体基类
public abstract class Entity
{
public string Id { get; set; }
}
// 使用仓库
public class SomeService
{
private readonly IRepository<SomeEntity> _repository;
public SomeService(IRepository<SomeEntity> repository)
{
_repository = repository;
}
public async Task DoSomethingWithEntityAsync(string id)
{
var entity = await _repository.GetByIdAsync(id);
// ... 业务逻辑处理
await _repository.UpdateAsync(id, entity);
}
}
这个示例展示了如何定义一个通用的数据仓库接口,并提供了一个MongoDB的实现。同时,它演示了如何使用仓库来简化服务中的数据访问逻辑。这种模式有助于保持代码的清晰和易于维护。