国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

這篇具有很好參考價(jià)值的文章主要介紹了基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

SqlSugar的開發(fā)框架本身主要是基于常規(guī)關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)的框架,支持多種數(shù)據(jù)庫(kù)類型的接入,如SqlServer、MySQL、Oracle、PostgreSQL、SQLite等數(shù)據(jù)庫(kù),非關(guān)系型數(shù)據(jù)庫(kù)的MongoDB數(shù)據(jù)庫(kù)也可以作為擴(kuò)展整合到開發(fā)框架里面,通過基類的繼承關(guān)系很好的封裝了相關(guān)的基礎(chǔ)操作功能,極大的減少相關(guān)處理MongoDB的代碼,并提供很好的開發(fā)效率。本篇隨筆介紹如何在SqlSugar的開發(fā)框架整合MongoDB數(shù)據(jù)庫(kù)的開發(fā)。

1、MongDB的簡(jiǎn)單介紹

MongoDB是一款由C++編寫的高性能、開源、無模式的常用非關(guān)系型數(shù)據(jù)庫(kù)產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富、最像關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)。它擴(kuò)展了關(guān)系型數(shù)據(jù)庫(kù)的眾多功能,例如:輔助索引、范圍查詢、排序等。?

MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似Json的Bson格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型。
MongoDB 最大的特點(diǎn)是它支持的查詢語(yǔ)言非常強(qiáng)大,其語(yǔ)法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z(yǔ)言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫(kù)單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。并且MongoDB-4.2版本開始已經(jīng)支持分布式事務(wù)功能。

MongoDB數(shù)據(jù)庫(kù)有幾個(gè)簡(jiǎn)單的概念需要了解一下。

? ? 1)MongoDB中的?database?有著和我們熟知的"數(shù)據(jù)庫(kù)"一樣的概念 (對(duì) Oracle 來說就是 schema)。一個(gè) MongoDB 實(shí)例中,可以有零個(gè)或多個(gè)數(shù)據(jù)庫(kù),每個(gè)都作為一個(gè)高等容器,用于存儲(chǔ)數(shù)據(jù)。

? ? 2)數(shù)據(jù)庫(kù)中可以有零個(gè)或多個(gè)?collections?(集合)。集合和傳統(tǒng)意義上的 table 基本一致,可以簡(jiǎn)單的把兩者看成是一樣的東西。

? ? 3)集合是由零個(gè)或多個(gè)?documents?(文檔)組成。同樣,一個(gè)文檔可以看成是一?row。

? ? 4)文檔是由零個(gè)或多個(gè)?fields?(字段)組成。,對(duì)應(yīng)的就是關(guān)系數(shù)據(jù)庫(kù)的?columns

? ? 5)Indexes?(索引)在 MongoDB 中扮演著和它們?cè)?RDBMS 中一樣的角色,都是為了提高查詢的效率。

? ? 6)Cursors?(游標(biāo))和上面的五個(gè)概念都不一樣,但是它非常重要,并且經(jīng)常被忽視,其中最重要的你要理解的一點(diǎn)是,游標(biāo)是當(dāng)你問 MongoDB 拿數(shù)據(jù)的時(shí)候,它會(huì)給你返回一個(gè)結(jié)果集的指針而不是真正的數(shù)據(jù),這個(gè)指針我們叫它游標(biāo),我們可以拿游標(biāo)做我們想做的任何事情,比如說計(jì)數(shù)或者跨行之類的,而無需把真正的數(shù)據(jù)拖下來,在真正的數(shù)據(jù)上操作。

?它們的對(duì)比關(guān)系圖如下所示。

數(shù)據(jù)在Mongodb里面都是以Json格式方式進(jìn)行存儲(chǔ)的,如下所示是其中的一個(gè)記錄內(nèi)容。

BSON格式

Bson是一種類Json的一種二進(jìn)制形式的存儲(chǔ)格式,簡(jiǎn)稱Binary Json,它和Json一樣,支持內(nèi)嵌的文檔對(duì)象和數(shù)組對(duì)象,但是Bson有Json沒有的一些數(shù)據(jù)類型,如Date和BinData類型。

Bson可以做為網(wǎng)絡(luò)數(shù)據(jù)交換的一種存儲(chǔ)形式,這個(gè)有點(diǎn)類似于Google的Protocol?Buffer,但是Bson是一種schema-less的存儲(chǔ)形式,它的優(yōu)點(diǎn)是靈活性高,但它的缺點(diǎn)是空間利用率不是很理想,Bson有三個(gè)特點(diǎn):輕量性、可遍歷性、高效性,

{“hello":"world"} 這是一個(gè)Bson的例子,其中"hello"是key name,它一般是cstring類型,字節(jié)表示是cstring::= (byte*) "/x00" ,其中*表示零個(gè)或多個(gè)byte字節(jié),/x00表示結(jié)束符;后面的"world"是value值,它的類型一般是string,double,array,binarydata等類型。

MongDB數(shù)據(jù)庫(kù)本身支持多種開發(fā)語(yǔ)言的驅(qū)動(dòng),MongoDB有官方的驅(qū)動(dòng)如下:

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

我們框架基于C#開發(fā),使用的時(shí)候,安裝MongoDB的C#的驅(qū)動(dòng)?MongoDB.Driver?即可。

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

在MongoDB數(shù)據(jù)庫(kù)的集合里面,都要求文檔有一個(gè)_id字段,這個(gè)是強(qiáng)制性的,而且這個(gè)字段的存儲(chǔ)類型為ObjectId類型,這個(gè)值考慮了分布式的因素,綜合了機(jī)器碼,進(jìn)程,時(shí)間戳等等方面的內(nèi)容,它的構(gòu)造如下所示。

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

ObjectId是一個(gè)12字節(jié)的??BSON?類型字符串。按照字節(jié)順序,依次代表:

  • 4字節(jié):UNIX時(shí)間戳
  • 3字節(jié):表示運(yùn)行MongoDB的機(jī)器
  • 2字節(jié):表示生成此_id的進(jìn)程
  • 3字節(jié):由一個(gè)隨機(jī)數(shù)開始的計(jì)數(shù)器生成的值

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

實(shí)體基類一般包含了一個(gè)屬性Id,這個(gè)是一個(gè)字符串型的對(duì)象(也可以使用ObjectId類型,但是為了方便,我們使用字符型,并聲明為ObjectId類型即可),由于我們聲明了該屬性對(duì)象為ObjectId類型,那么我們就可以在C#代碼里面使用字符串的ID類型了。

?

2、基于MongoDB數(shù)據(jù)庫(kù)的封裝處理

以前介紹過,針對(duì)常規(guī)關(guān)系型數(shù)據(jù)庫(kù)的開發(fā),在SqlSugar開發(fā)框架上,我們?cè)O(shè)計(jì)一些基類,以便重用相關(guān)的邏輯代碼,通過泛型的約束,可以提供強(qiáng)類型的數(shù)據(jù)接口,非常方便。

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

其中MyCrudService里面封裝了很多CRUD以及常用的處理方法。類似的處理方式,我們專門為MongoDB數(shù)據(jù)庫(kù)的訪問操作,設(shè)計(jì)了一個(gè)功能強(qiáng)大的基類即可。

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

在數(shù)據(jù)庫(kù)表的實(shí)體對(duì)應(yīng)關(guān)系上,我們依舊遵循則相應(yīng)的設(shè)計(jì)規(guī)則,基類實(shí)體采用IEntity<string>的接口類型,因此他們具有一個(gè)字符串的Id類型。其他業(yè)務(wù)對(duì)象繼承該基類對(duì)象即可。

    /// <summary>
    /// 基于MongoDB的實(shí)體類基類
    /// </summary>
    public class BaseMongoEntity : Entity<string>
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public override string Id { get; set; }
    }

相應(yīng)的,我們根據(jù)常規(guī)數(shù)據(jù)庫(kù)的基類接口名稱,在處理MongoDB數(shù)據(jù)庫(kù)的操作接口的時(shí)候,名稱保持一致性。

其中TEntity為強(qiáng)類型實(shí)體類型,而TGetListInput 是定義的一個(gè)分頁(yè)接口。定義的基類接口代碼如下所示。

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

其中接口對(duì)象 CurrentApiUser是我們用戶上下文的信息,包含一些駐留在ClainPrincipal中的信息,用于記錄訪問接口的用戶信息的。

其他接口定義類似的處理即可。

基類接口的實(shí)現(xiàn)類,就是我們需要設(shè)計(jì)的MongoDB數(shù)據(jù)庫(kù)操作類了,初始化類的代碼如下所示。

    /// <summary>
    /// MongoDB基礎(chǔ)倉(cāng)儲(chǔ)實(shí)現(xiàn)
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    public abstract class BaseMongoService<TEntity, TGetListInput> : IBaseMongoService<TEntity, TGetListInput> 
        where TEntity : class, IEntity<string>, new()
        where TGetListInput : IPagedAndSortedResultRequest
    {
        protected readonly IMongoDBContext mongoContext = NullMongoDBContext.Instance;//空實(shí)現(xiàn)
        protected IMongoCollection<TEntity> collection;           //強(qiáng)類型對(duì)象集合
        protected IMongoCollection<BsonDocument> bsonCollection; //弱類型集合BsonDocument集合
        /// <summary>
        /// 當(dāng)前Api用戶信息
        /// </summary>
        public IApiUserSession CurrentApiUser { get; set; } = NullApiUserSession.Instance;//空實(shí)現(xiàn)

        /// <summary>
        /// 構(gòu)造函數(shù)
        /// </summary>
        protected BaseMongoService()
        {
            //如果SerivcePovider已經(jīng)設(shè)置值,則獲得注入的接口對(duì)象
            if (ServiceLocator.SerivcePovider != null)
            {
                CurrentApiUser = ServiceLocator.GetService<IApiUserSession>();
                mongoContext = ServiceLocator.GetService<IMongoDBContext>();
                collection = mongoContext.GetCollection<TEntity>(typeof(TEntity).Name);//強(qiáng)類型對(duì)象集合
                bsonCollection = mongoContext.GetCollection<BsonDocument>(typeof(TEntity).Name);//弱類型集合BsonDocument集合
            }
        }
        /// <summary>
        /// 獲取所有記錄
        /// </summary>
        /// <returns></returns>
        public virtual async Task<ListResultDto<TEntity>> GetAllAsync()
        {
            var all = await collection.FindAsync(Builders<TEntity>.Filter.Empty);
            var list = await all.ToListAsync();
            return new ListResultDto<TEntity>()
            {
                Items = list
            };
        }

我們通過構(gòu)建對(duì)應(yīng)的強(qiáng)類型Collection和弱類型Collection,來操作實(shí)體類和BsonDocument的相關(guān)操作的。其中的上下文對(duì)象,參考隨筆《NoSQL – MongoDB Repository Implementation in .NET Core with Unit Testing example》進(jìn)行的處理。

   /// <summary>
    /// MongoDB 上下文對(duì)象
    /// </summary>
    public class MongoDBContext : IMongoDBContext
    {
        private IMongoDatabase _db { get; set; }
        private MongoClient _mongoClient { get; set; }
        public IClientSessionHandle Session { get; set; }

        public MongoDBContext(IOptions<Mongosettings> configuration)
        {
            _mongoClient = new MongoClient(configuration.Value.Connection);
            _db = _mongoClient.GetDatabase(configuration.Value.DatabaseName);
        }

        /// <summary>
        /// 獲取強(qiáng)類型集合對(duì)象
        /// </summary>
        /// <typeparam name="T">對(duì)象類型</typeparam>
        /// <param name="name"></param>
        /// <returns></returns>
        public IMongoCollection<T> GetCollection<T>(string name) where T : class, new()
        {
            return _db.GetCollection<T>(name);
        }
    }

    public interface IMongoDBContext
    {
        IMongoCollection<T> GetCollection<T>(string name) where T : class, new();
    }

通過IOptions 方式我們注入對(duì)應(yīng)的MongoDB數(shù)據(jù)庫(kù)配置信息,在appsettings.json中添加根節(jié)點(diǎn)內(nèi)容。

  "MongoSettings": {
    "Connection": "mongodb://localhost:27017/", //MongoDB連接字符串
    "DatabaseName": "iqidi" //MongoDB數(shù)據(jù)庫(kù)名稱
  },

我們?cè)趩?dòng)Web API的時(shí)候,在Program.cs 代碼中配置好就可以了。

//MongoDB配置
builder.Services.Configure<Mongosettings>(builder.Configuration.GetSection("MongoSettings"));

默認(rèn)初始化的IMongoDBContext是一個(gè)空接口,我們可以在Web API啟動(dòng)的時(shí)候,指定一個(gè)具體的實(shí)現(xiàn)就可以了

//添加IMongoContext實(shí)現(xiàn)類
builder.Services.AddSingleton<IMongoDBContext, MongoDBContext>();

對(duì)于基類接口,分頁(yè)查詢獲取對(duì)應(yīng)列表數(shù)據(jù),是常規(guī)的處理方式,默認(rèn)需要排序、分頁(yè),返回對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),如下代碼所示。

        /// <summary>
        /// 根據(jù)條件獲取列表
        /// </summary>
        /// <param name="input">分頁(yè)查詢條件</param>
        /// <returns></returns>
        public virtual async Task<PagedResultDto<TEntity>> GetListAsync(TGetListInput input)
        {
            var query = CreateFilteredQueryAsync(input);
            var totalCount = await query.CountAsync();
            
            //排序處理
            query = ApplySorting(query, input);
            //分頁(yè)處理
            query = ApplyPaging(query, input);
            //獲取列表
            var list = await query.ToListAsync();

            return new PagedResultDto<TEntity>(
               totalCount,
               list
           );
        }

其中PagedResultDto?是我們SqlSugar開發(fā)框架參照ABP框架定義一個(gè)數(shù)據(jù)結(jié)構(gòu),包含一個(gè)TotalCount數(shù)量和一個(gè)Items的對(duì)象集合。而其中?CreateFilteredQueryAsync 是定義的一個(gè)可供業(yè)務(wù)子類重寫的函數(shù),用來處理具體的查詢條件。在基類BaseMongoService中只是提供一個(gè)默認(rèn)的可查詢對(duì)象。

        /// <summary>
        /// 留給子類實(shí)現(xiàn)過濾條件的處理
        /// </summary>
        /// <returns></returns>
        protected virtual IMongoQueryable<TEntity> CreateFilteredQueryAsync(TGetListInput input)
        {
            return collection.AsQueryable();
        }

例如,對(duì)于一個(gè)具體的業(yè)務(wù)對(duì)象操作類,CustomerService的定義如下所示,并且具體化查詢的條件處理,如下代碼所示。

namespace SugarProject.Core.MongoDB
{
    /// <summary>
    /// 基于MongoDB數(shù)據(jù)庫(kù)的應(yīng)用層服務(wù)接口實(shí)現(xiàn)
    /// </summary>
    public class CustomerService : BaseMongoService<CustomerInfo, CustomerPagedDto>, ICustomerService
    {
        /// <summary>
        /// 構(gòu)造函數(shù)
        /// </summary>
        public CustomerService()
        {
        }
        /// <summary>
        /// 自定義條件處理
        /// </summary>
        /// <param name="input">查詢條件Dto</param>
        /// <returns></returns>
        protected override IMongoQueryable<CustomerInfo> CreateFilteredQueryAsync(CustomerPagedDto input)
        {
            var query = base.CreateFilteredQueryAsync(input);

            query = query
                .Where(t=> !input.ExcludeId.IsNullOrWhiteSpace() && t.Id != input.ExcludeId) //不包含排除ID
                .Where(t=> !input.Name.IsNullOrWhiteSpace() && t.Name.Contains(input.Name)) //如需要精確匹配則用Equals                                                                                             //年齡區(qū)間查詢
                .Where(t=> input.AgeStart.HasValue && t.Age >= input.AgeStart.Value)
                .Where(t => input.AgeEnd.HasValue && t.Age <= input.AgeEnd.Value)
                //創(chuàng)建日期區(qū)間查詢
                .Where(t => input.CreateTimeStart.HasValue && t.CreateTime >= input.CreateTimeStart.Value)
                .Where(t => input.CreateTimeEnd.HasValue && t.CreateTime <= input.CreateTimeEnd.Value)
                ;

            return query;
        }

這個(gè)處理方式類似于常規(guī)關(guān)系型數(shù)據(jù)庫(kù)的處理方式,就是對(duì)條件的判斷處理。而具體的業(yè)務(wù)對(duì)象模型,和常規(guī)框架的實(shí)體類很類似。

    /// <summary>
    /// 客戶信息
    /// 繼承自BaseMongoEntity,擁有Id主鍵屬性
    /// </summary>
    public class CustomerInfo : BaseMongoEntity
    {
        /// <summary>
        /// 默認(rèn)構(gòu)造函數(shù)(需要初始化屬性的在此處理)
        /// </summary>
        public CustomerInfo()
        {
            this.CreateTime = System.DateTime.Now;
        }

        #region Property Members

        /// <summary>
        /// 姓名
        /// </summary>
        public virtual string Name { get; set; }
        /// <summary>
        /// 年齡
        /// </summary>
        public virtual int Age { get; set; }
        /// <summary>
        /// 創(chuàng)建人
        /// </summary>
        public virtual string Creator { get; set; }
        /// <summary>
        /// 創(chuàng)建時(shí)間
        /// </summary>
        public virtual DateTime CreateTime { get; set; }

        #endregion
    }

對(duì)于插入和更新操作等常規(guī)操作,我們調(diào)用普通的Collection操作處理就可以了

        /// <summary>
        /// 創(chuàng)建對(duì)象
        /// </summary>
        /// <param name="input">實(shí)體對(duì)象</param>
        /// <returns></returns>
        public virtual async Task InsertAsync(TEntity input)
        {
            SetObjectIdIfEmpty(input);//如果Id為空,設(shè)置為ObjectId的值
            await collection.InsertOneAsync(input);
        }

        /// <summary>
        /// 更新記錄
        /// </summary>
        public virtual async Task<bool> UpdateAsync(TEntity input)
        {
            SetObjectIdIfEmpty(input);//如果Id為空,設(shè)置為ObjectId的值

            //await _dbSet.ReplaceOneAsync(Builders<TEntity>.Filter.Eq("_id", input.Id), input);

            //要修改的字段
            var list = new List<UpdateDefinition<TEntity>>();
            foreach (var item in input.GetType().GetProperties())
            {
                if (item.Name.ToLower() == "id") continue;
                list.Add(Builders<TEntity>.Update.Set(item.Name, item.GetValue(input)));
            }
            var updatefilter = Builders<TEntity>.Update.Combine(list);
            var update = await collection.UpdateOneAsync(Builders<TEntity>.Filter.Eq("_id", input.Id), updatefilter);
            var result = update != null && update.ModifiedCount > 0;
            return result;
        }

更新操作,有一種整個(gè)替換更新,還有一個(gè)是部分更新,它們兩者是有區(qū)別的。如果對(duì)于部分字段的更新,那么操作如下所示 ,主要是利用UpdateDefinition對(duì)象來指定需要更新那些字段屬性及值等信息。

        /// <summary>
        /// 封裝處理更新的操作(部分字段更新)
        /// </summary>
        /// <example>
        ///  var update = Builders<UserInfo>.Update.Set(s => s.Name, newName);
        /// </example>
        public virtual async Task<bool> UpdateAsync(string id, UpdateDefinition<TEntity> update)
        {
            var result = await collection.UpdateOneAsync(s => s.Id == id, update, new UpdateOptions() { IsUpsert = true });
            return result != null && result.ModifiedCount > 0;
        }

根據(jù)MongoDB數(shù)據(jù)庫(kù)的特性,我們盡量細(xì)化對(duì)數(shù)據(jù)庫(kù)操作的基類接口,定義所需的接口函數(shù)即可。

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

對(duì)于Web API的控制器設(shè)計(jì),我們?cè)谥暗碾S筆也有介紹,為常規(guī)授權(quán)處理的BaseApiController,為常規(guī)業(yè)務(wù)CRUD等接口處理的BusinessController,如下所示。

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合?

其中ControllerBase是.net core Web API中的標(biāo)準(zhǔn)控制器基類,我們由此派生一個(gè)LoginController用于登錄授權(quán),而BaseApiController則處理常規(guī)接口用戶身份信息,而BusinessController則是對(duì)標(biāo)準(zhǔn)的增刪改查等基礎(chǔ)接口進(jìn)行的封裝,我們實(shí)際開發(fā)的時(shí)候,只需要開發(fā)編寫類似CustomerController基類即可。

而對(duì)于?MongoDB的Web API控制器,我們?yōu)榱朔奖汩_發(fā),也設(shè)計(jì)了同類型的Web API 控制器基類。

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

其中MongoBaseController基類具有常規(guī)的CRUD的接口定義處理,只要繼承它就可以了,而如果只是繼承BaseApiController這需要自定義控制器接口的方法。

其中MongoBaseController 的基類代碼部分如下所示(通過注入Service層的接口實(shí)現(xiàn)業(yè)務(wù)調(diào)用)。

    /// <summary>
    /// 基于MongoDB的業(yè)務(wù)操作接口封裝的基類控制器
    /// </summary>
    public class MongoBaseController<TEntity, TGetListInput> : BaseApiController
        where TEntity : class, IEntity<string>, new()
        where TGetListInput : IPagedAndSortedResultRequest
    {
        /// <summary>
        /// 通用基礎(chǔ)操作接口
        /// </summary>
        protected IBaseMongoService<TEntity, TGetListInput> _service { get; set; }
/// <summary> /// 構(gòu)造函數(shù),初始化基礎(chǔ)接口 /// </summary> /// <param name="service">通用基礎(chǔ)操作接口</param> public MongoBaseController(IBaseMongoService<TEntity, TGetListInput> service) { this._service = service; } /// <summary> /// 獲取所有記錄 /// </summary> [HttpGet] [Route("all")] public virtual async Task<ListResultDto<TEntity>> GetAllAsync() { //檢查用戶是否有權(quán)限,否則拋出MyDenyAccessException異常 base.CheckAuthorized(AuthorizeKey.ListKey); return await _service.GetAllAsync(); } /// <summary> /// 根據(jù)條件獲取列表 /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpGet] [Route("list")] public virtual async Task<PagedResultDto<TEntity>> GetListAsync([FromQuery] TGetListInput input) { //檢查用戶是否有權(quán)限,否則拋出MyDenyAccessException異常 base.CheckAuthorized(AuthorizeKey.ListKey); return await _service.GetListAsync(input); } /// <summary> /// 根據(jù)ID獲取單一對(duì)象 /// </summary> /// <param name="id">主鍵ID</param> /// <returns></returns> [HttpGet] [Route("{id}")] public virtual async Task<TEntity> GetAsync(string id) { //檢查用戶是否有權(quán)限,否則拋出MyDenyAccessException異常 base.CheckAuthorized(AuthorizeKey.ViewKey); return await _service.GetAsync(id); } .................

最后我們啟動(dòng)Swagger進(jìn)行測(cè)試對(duì)應(yīng)的接口即可,實(shí)際還可以整合在UI中進(jìn)行測(cè)試處理。我們安裝MongoDB數(shù)據(jù)庫(kù)的管理工具后,可以在MongoDBCompass 中進(jìn)行查詢對(duì)應(yīng)數(shù)據(jù)庫(kù)的數(shù)據(jù)。

    /// <summary>
    /// 客戶信息的控制器對(duì)象(基于MongoDB),基于BaseApiController,需要自定義接口處理
    /// </summary>
    [ApiController]
    [Route("api/MongoCustomer")]
    public class MongoCustomerController : BaseApiController
    {
        private ICustomerService _service;

        /// <summary>
        /// 構(gòu)造函數(shù),并注入基礎(chǔ)接口對(duì)象
        /// </summary>
        /// <param name="service"></param>
        public MongoCustomerController(ICustomerService service) 
        {
            this._service = service;
        }

        /// <summary>
        /// 獲取所有記錄
        /// </summary>
        [HttpGet]
        [Route("all")]
        public virtual async Task<ListResultDto<CustomerInfo>> GetAllAsync()
        {
            //檢查用戶是否有權(quán)限,否則拋出MyDenyAccessException異常
            base.CheckAuthorized(AuthorizeKey.ListKey);

            return await _service.GetAllAsync();
        }

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

?而如果繼承自MongoBaseController?,那么就會(huì)具有基類MongoBaseController 公開的所有控制器方法。?

    /// <summary>
    /// 客戶信息的控制器對(duì)象(基于MongoDB),基于MongoBaseController,具有常規(guī)CRUD操作接口
    /// </summary>
    [ApiController]
    [Route("api/MongoCustomer2")]
    public class MongoCustomer2Controller : MongoBaseController<CustomerInfo, CustomerPagedDto>
    {
        /// <summary>
        /// 構(gòu)造函數(shù),并注入基礎(chǔ)接口對(duì)象
        /// </summary>
        /// <param name="service"></param>
        public MongoCustomer2Controller(ICustomerService service) : base(service)
        {
        }
    }

基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

?基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合

早幾年前曾經(jīng)也介紹過該數(shù)據(jù)庫(kù)的相關(guān)使用,隨筆如下所示,有需要也可以了解下。文章來源地址http://www.zghlxwxcb.cn/news/detail-412263.html

基于C#的MongoDB數(shù)據(jù)庫(kù)開發(fā)應(yīng)用(4)--Redis的安裝及使用?伍華聰 2016-01-12?
基于C#的MongoDB數(shù)據(jù)庫(kù)開發(fā)應(yīng)用(3)--MongoDB數(shù)據(jù)庫(kù)的C#開發(fā)之異步接口?伍華聰 2016-01-12?
基于C#的MongoDB數(shù)據(jù)庫(kù)開發(fā)應(yīng)用(2)--MongoDB數(shù)據(jù)庫(kù)的C#開發(fā)?伍華聰 2016-01-06
基于C#的MongoDB數(shù)據(jù)庫(kù)開發(fā)應(yīng)用(1)--MongoDB數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)和使用?伍華聰 2016-01-05
?

到了這里,關(guān)于基于SqlSugar的開發(fā)框架循序漸進(jìn)介紹(27)-- 基于MongoDB的數(shù)據(jù)庫(kù)操作整合的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包