Мы недавно начали использовать шаблон репозитория и совокупный корневой шаблон. Все это хорошо работает, когда я отслеживаю изменения с помощью EntityFramework, и я могу вызвать SaveChanges, когда я закончил работу над своей совокупностью.Образец репозитория и совокупный корневой шаблон. Как сделать SaveChanges в репозитории?
Теперь моя проблема в том, что я также хочу использовать этот шаблон с моим mongodb, но по своей природе mongodb не поддерживает отслеживание изменений. Рокинг моего собственного отслеживания изменений кажется немного излишним.
Моя проблема заключается в том, что я не могу работать с моей сущностью в связанном агрегате, а затем использовать репозиторий, чтобы сохранить его обратно в mongodb. Я могу сделать это только в том случае, если я использую ReplaceOneAsync
, который, похоже, не подходит, потому что это чат, который я создаю, и поэтому может иметь несколько операций записи от разных клиентов.
Я хотел бы иметь какое-то отслеживание изменений, которое позволит мне вызвать SaveChanges в репозитории с указанным агрегатом.
Ней некоторые псевдо-код, который пытается объяснить, что я хочу сделать:
public abstract class BaseMongoRepository<TAggregate, TCollection> : IRepository<TAggregate> where TAggregate : BaseAggregateRoot, IMongoAggregate<TCollection>
{
private readonly IMongoCollection<TCollection> _mongoCollection;
protected BaseMongoRepository(IMongoCollection<TCollection> mongoCollection)
{
_mongoCollection = mongoCollection;
}
public async Task<bool> SaveAsync(TAggregate aggregate)
{
var state = aggregate.GetState();
foreach (var stateChange in state.Changes)
{
var change = stateChange.ToUpdateDefinition();
await _mongoCollection.UpdateOneAsync<TCollection>(aggregate.GetSelector(), change);
}
return true;
}
public TAggregate GetMongoAggregate(Expression<Func<TCollection, bool>> selector)
{
var state = _mongoCollection.AsQueryable().SingleOrDefault(selector);
return new AggregateWithSelector(state, selector);
}
}
GetMongoAggregate будет реализована в конкретных версиях репозитория, но здесь для псевдо цели.
Надеюсь, кто-то может отправить меня в правильном направлении или дать мне несколько советов о том, как моделировать это.
SaveChanges в EntityFramework посылает набор команд в транзакции в Sql БД (это единица работы образца) , Основное отличие MongoDB заключается в том, что он не поддерживает транзакции. Я думаю, что лучше найти подход, который хорошо работает с MongoDB. – rnofenko