關於Asp.Net Core MongoDB的執行個體代碼

來源:互聯網
上載者:User
廢話不說直接上代碼;

using MongoDB.Bson.Serialization.Attributes;namespace XL.Core.MongoDB{public interface IEntity<TKey>{/// <summary>/// 主鍵/// </summary>        [BsonId]        TKey Id { get; set; }    }}
View Code
    [BsonIgnoreExtraElements(Inherited = true)]public abstract class Entity : IEntity<string>{/// <summary>/// 主鍵/// </summary>        [BsonRepresentation(BsonType.ObjectId)]public virtual string Id { get; set; }            }
View Code
    public interface IRepository<T, in TKey> : IQueryable<T> where T : IEntity<TKey>{#region Fileds/// <summary>/// MongoDB表/// </summary>IMongoCollection<T> DbSet { get; }/// <summary>/// MongoDB庫/// </summary>IMongoDatabase DbContext { get; }#endregion#region Find/// <summary>/// 根據主鍵擷取對象/// </summary>/// <param name="id"></param>/// <returns></returns>        T GetById(TKey id);/// <summary>/// 擷取對象/// </summary>/// <param name="predicate"></param>/// <returns></returns>IEnumerable<T> Get(Expression<Func<T, bool>> predicate);/// <summary>/// 擷取對象/// </summary>/// <param name="predicate"></param>/// <param name="cancellationToken"></param>/// <returns></returns>Task<IEnumerable<T>> GetAsync(Expression<Func<T, bool>> predicate,            CancellationToken cancellationToken = default(CancellationToken));#endregion#region Insert/// <summary>/// 插入文檔/// </summary>/// <param name="entity"></param>/// <returns></returns>        T Insert(T entity);/// <summary>/// 非同步插入文檔/// </summary>/// <param name="entity"></param>/// <param name="cancellationToken"></param>/// <returns></returns>Task InsertAsync(T entity, CancellationToken cancellationToken = default(CancellationToken));/// <summary>///     Adds the new entities in the repository./// </summary>/// <param name="entities">The entities of type T.</param>void Insert(IEnumerable<T> entities);/// <summary>/// 插入文檔/// </summary>/// <param name="entities"></param>/// <param name="cancellationToken"></param>/// <returns></returns>Task InsertAsync(IEnumerable<T> entities, CancellationToken cancellationToken = default(CancellationToken));#endregion#region Update/// <summary>/// 更新文檔/// </summary>/// <param name="entity"></param>/// <returns></returns>        UpdateResult Update(T entity);/// <summary>/// 非同步更新文檔/// </summary>/// <param name="entity"></param>/// <param name="cancellationToken"></param>/// <returns></returns>Task<UpdateResult> UpdateAsync(T entity, CancellationToken cancellationToken = default(CancellationToken));#endregion#region Delete/// <summary>/// 根據主鍵ID/// </summary>/// <param name="id"></param>/// <returns></returns>        T Delete(TKey id);/// <summary>/// 非同步根據ID刪除文檔/// </summary>/// <param name="id"></param>/// <param name="cancellationToken"></param>/// <returns></returns>Task<T> DeleteAsync(TKey id, CancellationToken cancellationToken = default(CancellationToken));/// <summary>/// 非同步刪除/// </summary>/// <param name="predicate"></param>/// <param name="cancellationToken"></param>/// <returns></returns>Task<DeleteResult> DeleteAsync(Expression<Func<T, bool>> predicate,            CancellationToken cancellationToken = default(CancellationToken));/// <summary>/// 刪除/// </summary>/// <param name="predicate"></param>/// <returns></returns>DeleteResult Delete(Expression<Func<T, bool>> predicate);#endregion#region Other/// <summary>/// 計數/// </summary>/// <param name="predicate"></param>/// <returns></returns>long Count(Expression<Func<T, bool>> predicate);/// <summary>/// 計數/// </summary>/// <param name="predicate"></param>/// <param name="cancellationToken"></param>/// <returns></returns>Task<long> CountAsync(Expression<Func<T, bool>> predicate,            CancellationToken cancellationToken = new CancellationToken());/// <summary>/// 是否存在/// </summary>/// <param name="predicate"></param>/// <returns></returns>bool Exists(Expression<Func<T, bool>> predicate);#endregion#region Query/// <summary>/// 分頁/// 註:只適合單屬性排序/// </summary>/// <param name="predicate"></param>/// <param name="sortBy"></param>/// <param name="pageSize"></param>/// <param name="pageIndex"></param>/// <returns></returns>IEnumerable<T> Paged(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> sortBy,int pageSize, int pageIndex = 1);/// <summary>/// /// </summary>/// <param name="predicate"></param>/// <param name="sortBy"></param>/// <param name="pageSize"></param>/// <param name="pageIndex"></param>/// <param name="cancellationToken"></param>/// <returns></returns>Task<List<T>> PagedAsync(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> sortBy,int pageSize, int pageIndex = 1,            CancellationToken cancellationToken = new CancellationToken());#endregion}  public interface IRepository<T> : IRepository<T, string>where T : IEntity<string>{    }
View Code
  public class MongoRepository<T> : IRepository<T> where T : IEntity<string>{#region Constructorprotected MongoRepository(IMongoCollection<T> collection)        {            DbSet = collection;            DbContext = collection.Database;        }#endregionpublic IEnumerator<T> GetEnumerator()        {return DbSet.AsQueryable().GetEnumerator();        }        IEnumerator IEnumerable.GetEnumerator()        {return GetEnumerator();        }#region 欄位public Type ElementType => DbSet.AsQueryable().ElementType;public Expression Expression => DbSet.AsQueryable().Expression;public IQueryProvider Provider => DbSet.AsQueryable().Provider;public IMongoCollection<T> DbSet { get; }public IMongoDatabase DbContext { get; }#endregion#region Findpublic T GetById(string id)        {return Get(a => a.Id.Equals(id)).FirstOrDefault();        }public IEnumerable<T> Get(Expression<Func<T, bool>> predicate)        {return DbSet.FindSync(predicate).Current;        }public async Task<IEnumerable<T>> GetAsync(Expression<Func<T, bool>> predicate,            CancellationToken cancellationToken = new CancellationToken())        {var task = await DbSet.FindAsync(predicate, null, cancellationToken);return task.Current;        }#endregion#region Insertpublic T Insert(T entity)        {            DbSet.InsertOne(entity);return entity;        }public Task InsertAsync(T entity, CancellationToken cancellationToken = new CancellationToken())        {return DbSet.InsertOneAsync(entity, null, cancellationToken);        }public void Insert(IEnumerable<T> entities)        {            DbSet.InsertMany(entities);        }public Task InsertAsync(IEnumerable<T> entities, CancellationToken cancellationToken = new CancellationToken())        {return DbSet.InsertManyAsync(entities, null, cancellationToken);        }#endregion#region Updatepublic UpdateResult Update(T entity)        {var doc = entity.ToBsonDocument();return DbSet.UpdateOne(Builders<T>.Filter.Eq(e => e.Id, entity.Id),new BsonDocumentUpdateDefinition<T>(doc));        }public Task<UpdateResult> UpdateAsync(T entity, CancellationToken cancellationToken = new CancellationToken())        {var doc = entity.ToBsonDocument();return DbSet.UpdateOneAsync(Builders<T>.Filter.Eq(e => e.Id, entity.Id),new BsonDocumentUpdateDefinition<T>(doc), cancellationToken: cancellationToken);        }#endregion#region Deletepublic T Delete(string id)        {return DbSet.FindOneAndDelete(a => a.Id.Equals(id));        }public Task<T> DeleteAsync(string id, CancellationToken cancellationToken = new CancellationToken())        {return DbSet.FindOneAndDeleteAsync(a => a.Id.Equals(id), null, cancellationToken);        }public Task<DeleteResult> DeleteAsync(Expression<Func<T, bool>> predicate,            CancellationToken cancellationToken = new CancellationToken())        {return DbSet.DeleteManyAsync(predicate, cancellationToken);        }public DeleteResult Delete(Expression<Func<T, bool>> predicate)        {return DbSet.DeleteMany(predicate);        }#endregion#region Otherpublic long Count(Expression<Func<T, bool>> predicate)        {return DbSet.Count(predicate);        }public Task<long> CountAsync(Expression<Func<T, bool>> predicate,            CancellationToken cancellationToken = new CancellationToken())        {return DbSet.CountAsync(predicate, null, cancellationToken);        }public bool Exists(Expression<Func<T, bool>> predicate)        {return Get(predicate).Any();        }#endregion#region Pagepublic IEnumerable<T> Paged(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> sortBy,int pageSize, int pageIndex = 1)        {var sort = Builders<T>.Sort.Descending(sortBy);return DbSet.Find(predicate).Sort(sort).Skip(pageSize * pageIndex - 1).Limit(pageSize).ToList();        }public Task<List<T>> PagedAsync(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> sortBy,int pageSize, int pageIndex = 1,            CancellationToken cancellationToken = new CancellationToken())        {return Task.Run(() =>{var sort = Builders<T>.Sort.Descending(sortBy);return DbSet.Find(predicate).Sort(sort).Skip(pageSize * pageIndex - 1).Limit(pageSize).ToList();            }, cancellationToken);        }#endregion#region Helper/// <summary>/// 擷取類型的所有屬性資訊/// </summary>/// <typeparam name="T"></typeparam>/// <typeparam name="TProperty"></typeparam>/// <param name="select"></param>/// <returns></returns>private PropertyInfo[] GetPropertyInfos<TProperty>(Expression<Func<T, TProperty>> select)        {var body = select.Body;switch (body.NodeType)            {case ExpressionType.Parameter:var parameterExpression = body as ParameterExpression;if (parameterExpression != null) return parameterExpression.Type.GetProperties();break;case ExpressionType.New:var newExpression = body as NewExpression;if (newExpression != null)return newExpression.Members.Select(m => m as PropertyInfo).ToArray();break;            }return null;        }#endregion}
View Code

使用如下:

    public class MongoDBSetting    {public string DataBase { get; set; }public string UserName { get; set; }public string Password { get; set; }public List<MongoServers> Services { get; set; }    }public class MongoServers    {public string Host { get; set; }public int Port { get; set; } = 27017;    }
View Code

 public class LogsContext    {private readonly IMongoDatabase _db;public LogsContext(IOptions<MongoDBSetting> options)        {var permissionSystem =MongoCredential.CreateCredential(options.Value.DataBase, options.Value.UserName,                    options.Value.Password);var services = new List<MongoServerAddress>();foreach (var item in options.Value.Services)            {                services.Add(new MongoServerAddress(item.Host, item.Port));            }var settings = new MongoClientSettings            {                Credentials = new[] {permissionSystem},                Servers = services            };var _mongoClient = new MongoClient(settings);            _db = _mongoClient.GetDatabase(options.Value.DataBase);        }public IMongoCollection<ErrorLogs> ErrorLog => _db.GetCollection<ErrorLogs>("Error");public IMongoCollection<ErrorLogs> WarningLog => _db.GetCollection<ErrorLogs>("Warning");    }
View Code
 public static IServiceCollection UserMongoLog(this IServiceCollection services,            IConfigurationSection configurationSection)        {            services.Configure<MongoDBSetting>(configurationSection);            services.AddSingleton<LogsContext>();return services;        }
View Code
public interface IErrorLogService : IRepository<ErrorLog>{    }public class ErrorLogService : MongoRepository<ErrorLog>, IErrorLogService    {public ErrorLogService(LogsContext dbContext) : base(dbContext.ErrorLog)        {        }    }
View Code

最後:

services.UserMongoLog(Configuration.GetSection("Mongo.Log"));
View Code
"Mongo.Log": {"DataBase": "PermissionSystem","UserName": "sa","Password": "shtx@123","Services": [      {"Host": "192.168.1.6","Port": "27017"  }    ]  }
View Code

剛學洗使用MongoDB,才疏學淺,請大神多多指教

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.