public async Task <IReadOnlyCollection <T> > LoadAsync(ISpecification <T> spec)
        {
            var collection = _mongoDbAccess.GetDatabaseCollection <T>();

            var predicate = spec.ToExpression();
            var filter    = _filterFactory.CreateFilterDefinition(predicate);
            var result    = await collection.Find(filter).ToListAsync();

            return(result);
        }
        public async Task <T> SaveAsync(T aggregateRoot)
        {
            var collection = _mongoDbAccess.GetDatabaseCollection <T, TId>();

            var filter        = _filterDefinitionFactory.CreateFilterDefinition(f => f.Id.Equals(aggregateRoot.Id));
            var updateOptions = new FindOneAndReplaceOptions <T> {
                IsUpsert = true, ReturnDocument = ReturnDocument.After
            };
            var result = await collection.FindOneAndReplaceAsync(filter, aggregateRoot, updateOptions);

            return(result);
        }