.net core 2.2 & Mongodb

.net core 2.2 API項(xiàng)目中使用Mongodb 簡(jiǎn)單的CRUD封裝

項(xiàng)目結(jié)構(gòu)

創(chuàng)建FoodPlan.Core項(xiàng)目

  • 創(chuàng)建IEntityBase.cs 接口約束
  • 創(chuàng)建Single.cs 實(shí)體

  • IEntityBase.cs
    • 這個(gè)是為了方便在后面的泛型中使用id
    • 這里必須要用接口 不然在創(chuàng)建文檔約束時(shí)會(huì)報(bào)錯(cuò)!!
// IEntityBase.cs
using System;

namespace FoodPlan.Core.Entity
{
    public interface IEntityBase
    {
        Guid Id { get; set; }
    }
}
  • Single.cs
    • 測(cè)試就先寫兩個(gè)字段
// Single.cs
using System;

namespace FoodPlan.Core.Entity
{
    public class Single: IEntityBase
    {
        /// <summary>
        /// Id
        /// </summary>
        public Guid Id { get; set; }
        /// <summary>
        /// 名稱
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 價(jià)格
        /// </summary>
        public decimal Price { get; set; }
    }
}


創(chuàng)建FoodPlan.DB項(xiàng)目

  • 安裝nuget包
    • MongoDB.Driver (當(dāng)前項(xiàng)目 V2.7.2)
  • DBSettings.cs 數(shù)據(jù)庫(kù)連接字符串類
  • MongoContextService.cs 連接與獲取文檔
  • IBaseRepository.cs 公共CRUD接口
  • ISinglesRepository.cs Single的單獨(dú)的CRUD接口
  • BaseRepository.cs 公共CRUD實(shí)現(xiàn)
  • SinglesRepository.cs Single的CRUD實(shí)現(xiàn)

  • DBSettings.cs 數(shù)據(jù)庫(kù)連接字符串類
    • 這里只做最簡(jiǎn)單的連接
// DBSettings.cs
namespace FoodPlan.DB
{
    /// <summary>
    /// 數(shù)據(jù)連接字符串
    /// </summary>
    public class DBSettings
    {
        /// <summary>
        /// 連接字符串
        /// </summary>
        public string ConnectionString { get; set; }
        /// <summary>
        /// 庫(kù)名稱
        /// </summary>
        public string Database { get; set; }
    }
}
using Microsoft.Extensions.Options;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.IdGenerators;
using MongoDB.Driver;
using System;
using System.Collections.Generic;

namespace FoodPlan.DB.Mongo
{
    public class MongoContextService
    {
        private IMongoDatabase _datebase;
        //private delegate void SetBsonClassMap();
        /// <summary>
        /// 連接數(shù)據(jù)庫(kù)
        /// </summary>
        /// <param name="dBSettings">.ner core 設(shè)置的鏈接字符串</param>
        public MongoContextService(IOptions<DBSettings> dBSettings)
        {
            var client = new MongoClient(dBSettings.Value.ConnectionString);
            if (client != null)
            {
                _datebase = client.GetDatabase(dBSettings.Value.Database);
            }
        }
        /// <summary>
        /// 判斷文檔是否存在 不存在創(chuàng)建
        /// </summary>
        /// <param name="CollectionName">文檔名稱</param>
        /// <param name="setBsonClassMap">首次創(chuàng)建文檔字段映射與約束設(shè)置</param>
        private void CheckAndCreateCollection(string CollectionName, Action setBsonClassMap)
        {
            // 獲取數(shù)據(jù)庫(kù)中的所有文檔
            var collectionList = _datebase.ListCollections().ToList();
            // 保存文檔名稱
            var collectionNames = new List<string>();
            // 便利獲取文檔名稱
            collectionList.ForEach(b => collectionNames.Add(b["name"].AsString));
            // 判斷文檔是否存在
            if (!collectionNames.Contains(CollectionName))
            {
                // 首次創(chuàng)建文檔字段映射與約束設(shè)置
                setBsonClassMap();
                // 創(chuàng)建文檔
                _datebase.CreateCollection(CollectionName);
            }
        }
        /// <summary>
        /// 獲取ContactSingles文檔
        /// </summary>
        public IMongoCollection<Core.Entity.Single> ContactSingles
        {
            get
            {
                CheckAndCreateCollection("ContactSingles", SetBsonClassMapSingles);
                return _datebase.GetCollection<Core.Entity.Single>("ContactSingles");
            }
        }
        /// <summary>
        /// ContactSingles文檔字段映射
        /// </summary>
        private static void SetBsonClassMapSingles()
        {
            BsonClassMap.RegisterClassMap((BsonClassMap<Core.Entity.Single> cm) =>
            {
                cm.AutoMap();
                cm.MapIdMember(x => x.Id).SetIdGenerator(CombGuidGenerator.Instance); // 使用Guid作為文檔id
            });
        }
    }
}
  • IBaseRepository.cs 公共CRUD接口
    • CRUD
// IBaseRepository.cs
using System.Collections.Generic;
using System.Threading.Tasks;

namespace FoodPlan.DB.Mongo.IRepository
{
    public interface IBaseRepository<T> where T: IEntityBase
    {
        /// <summary>
        /// 添加一個(gè)數(shù)據(jù)
        /// </summary>
        /// <param name="addData">添加的數(shù)據(jù)</param>
        /// <returns></returns>
        Task AddAsync(T addData);
        /// <summary>
        /// 獲取所有數(shù)據(jù)
        /// </summary>
        /// <returns></returns>
        Task<IEnumerable<T>> AllAsync();
        /// <summary>
        /// 根據(jù)Id獲取一條數(shù)據(jù)
        /// </summary>
        /// <param name="id">數(shù)據(jù)Guid</param>
        /// <returns></returns>
        Task<T> GetOneAsync(Guid id);
        /// <summary>
        /// 刪除一條數(shù)據(jù)
        /// </summary>
        /// <param name="id">Guid</param>
        /// <returns></returns>
        Task<DeleteResult> DeleteAsync(Guid id);
        /// <summary>
        /// 修改一條完整的數(shù)據(jù)
        /// </summary>
        /// <param name="addData">修改的數(shù)據(jù)</param>
        /// <returns></returns>
        Task UpdateOneAsync(T addData);
    }

}
  • ISinglesRepository.cs Single的單獨(dú)的CRUD接口
    • 定義Single的單獨(dú)CRUD
// ISinglesRepository.cs
namespace FoodPlan.DB.Mongo.IRepository
{
    public interface ISinglesRepository: IBaseRepository<Core.Entity.Single>
    {
    }
}
  • BaseRepository.cs 公共CRUD實(shí)現(xiàn)
    • 注意:IOptions 是通過(guò)依賴注入到 .net core 應(yīng)用時(shí)獲取到的
using FoodPlan.Core.Entity;
using FoodPlan.DB.Mongo.IRepository;
using Microsoft.Extensions.Options;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace FoodPlan.DB.Mongo.Repository
{
    public abstract class BaseRepository<T> : IBaseRepository<T> where T : IEntityBase
    {
        /// <summary>
        /// 文檔
        /// </summary>
        protected IMongoCollection<T> _context;
        /// <summary>
        /// 數(shù)據(jù)庫(kù)
        /// </summary>
        protected MongoContextService _datebase;
        /// <summary>
        /// 構(gòu)成函數(shù)
        /// </summary>
        /// <param name="dBSettings">數(shù)據(jù)庫(kù)連接字符串</param>
        ///注意:IOptions 是通過(guò)依賴注入到 .net core 應(yīng)用時(shí)獲取到的
        public BaseRepository(IOptions<DBSettings> dBSettings)
        {
            _datebase = new MongoContextService(dBSettings);
        }
  
        public async Task AddAsync(T data)
        {
            await _context.InsertOneAsync(data);
        }

        public async Task<IEnumerable<T>> AllAsync()
        {
            return await _context.Find(_ => true).ToListAsync();
        }

        public async Task<DeleteResult> DeleteAsync(Guid id)
        {
            return await _context.DeleteOneAsync(filter => filter.Id == id);
        }

        public async Task<T> GetOneAsync(Guid id)
        {
            return await _context.Find(f => f.Id == id).FirstAsync();
        }

        public Task UpdateOneAsync(T addData)
        {
            throw new NotImplementedException();
        }
    }
}
  • SinglesRepository.cs Single的CRUD實(shí)現(xiàn)
using FoodPlan.DB.Mongo.IRepository;
using Microsoft.Extensions.Options;

namespace FoodPlan.DB.Mongo.Repository
{
    public class SinglesRepository : BaseRepository<Core.Entity.Single>, ISinglesRepository
    {
        public SinglesRepository(IOptions<DBSettings> dBSettings) : base(dBSettings)
        {
            _context = _datebase.ContactSingles;
        }
    }
}


創(chuàng)建FoodPlan.API項(xiàng)目

  • 修改 Program.cs
  • 創(chuàng)建appsettings.json
  • 創(chuàng)建appsettings.Development.json
  • 創(chuàng)建 Startup.Development.cs
  • 創(chuàng)建 SinglesController.cs

  • 修改 Program.cs
    • 環(huán)境變量設(shè)置在 Properties ->launchSettings.json
    • 如果不修改Program.cs 直接使用就用任何修改了(不需要?jiǎng)?chuàng)建appsettings.Development.json)
using System.Reflection;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace FoodPlan.API
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
.UseStartup(typeof(StartupDevelopment).GetTypeInfo().Assembly.FullName); // 根據(jù)環(huán)境變量選擇啟動(dòng)文件
    }
}

  • 創(chuàng)建appsettings.json

    • 如果你使用了 Development 環(huán)境這個(gè)就可以留空
    • 如果不用 Development環(huán)境就把a(bǔ)ppsettings.Development.json的內(nèi)容復(fù)制到這個(gè)文件中就可以
  • 創(chuàng)建appsettings.Development.json

    • 主要用到了連接字符串和庫(kù)名稱
// appsettings.Development.json
{
  "MongoConnection": {
    "ConnectionString": "mongodb://localhost:27017",
    "Database": "Food_Plan"
  }
}
  • 創(chuàng)建 Startup.Development.cs
    • 如果沒(méi)有使用 Development環(huán)境 就直接寫到 Startup.cs中就可以
// Startup.Development.cs
using FoodPlan.DB;
using FoodPlan.DB.Mongo.IRepository;
using FoodPlan.DB.Mongo.Repository;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace FoodPlan.API
{
    public class StartupDevelopment
    {
        public IConfiguration Configuration { get; }

        public StartupDevelopment(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            // 獲取數(shù)據(jù)庫(kù)連接字符串 獲取后就可以通過(guò)IOption獲取對(duì)應(yīng)的內(nèi)容了
            services.Configure<DBSettings>(options =>
            {
                options.ConnectionString = Configuration.GetSection("MongoConnection:ConnectionString").Value;
                options.Database = Configuration.GetSection("MongoConnection:Database").Value;
            });
            // https設(shè)置
            services.AddHttpsRedirection(options =>
            {
                options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;
                options.HttpsPort = 5001;
            });
            // 注入數(shù)據(jù)庫(kù)操作
            services.AddTransient<ISinglesRepository, SinglesRepository>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseHttpsRedirection();

            app.UseMvc();
        }
    }
}

  • 創(chuàng)建 SinglesController.cs
// SinglesController.cs 
using System;
using System.Threading.Tasks;
using FoodPlan.DB.Mongo.IRepository;
using Microsoft.AspNetCore.Mvc;

// For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace FoodPlan.API.Controllers
{
    [Route("api/single")]
    public class SinglesController : Controller
    {
        private readonly ISinglesRepository _singlesContext;

        public SinglesController(ISinglesRepository singlesRepository)
        {
            _singlesContext = singlesRepository;
        }
        // GET: /<controller>/
        [HttpGet]
        public async Task<IActionResult> GetAsync()
        {
            return Json(await _singlesContext.AllAsync());
        }

        [HttpPost]
        public IActionResult Post()
        {
            try
            {
                _singlesContext.AddAsync(new Core.Entity.Single() {
                    Name = "測(cè)試一號(hào)",
                    Price = 50,
                });
                return Ok(new { Isuccess = true });
            }
            catch (Exception)
            {

                return Ok(new { Isuccess = false });
            }
        }
        [HttpGet("{id}")]
        public async Task<IActionResult> GetOneAsync(string id)
        {
            return Ok(await _singlesContext.GetOneAsync(new Guid(id)));
        }
        [HttpDelete("{id}")]
        public async Task<IActionResult> DeleteAsync(string id)
        {
            return Ok(await _singlesContext.DeleteAsync(new Guid(id)));
        }
    }
}

結(jié)束了
學(xué)習(xí)的一點(diǎn)筆記歡迎指教批評(píng)瓣铣,有什么不妥或有什么疑問(wèn)歡迎交流N赶摹扑眉!
參考了很多楊旭老師的.net core教學(xué):
講得非常好昼捍。
推薦大家可以看.ner core api 視頻教程 https://www.bilibili.com/video/av33344382/?p=5
https://www.cnblogs.com/cgzl/p/9498482.html
https://space.bilibili.com/361469957/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翠肘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子伤溉,更是在濱河造成了極大的恐慌般码,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乱顾,死亡現(xiàn)場(chǎng)離奇詭異板祝,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)走净,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門券时,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人伏伯,你說(shuō)我怎么就攤上這事橘洞。” “怎么了说搅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵炸枣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我弄唧,道長(zhǎng)抛虏,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任套才,我火速辦了婚禮,結(jié)果婚禮上慕淡,老公的妹妹穿的比我還像新娘背伴。我一直安慰自己,他們只是感情好峰髓,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布傻寂。 她就那樣靜靜地躺著,像睡著了一般携兵。 火紅的嫁衣襯著肌膚如雪疾掰。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天徐紧,我揣著相機(jī)與錄音静檬,去河邊找鬼。 笑死并级,一個(gè)胖子當(dāng)著我的面吹牛拂檩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘲碧,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼稻励,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了愈涩?” 一聲冷哼從身側(cè)響起望抽,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤加矛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后煤篙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體斟览,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年舰蟆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趣惠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡身害,死狀恐怖味悄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情塌鸯,我是刑警寧澤侍瑟,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站丙猬,受9級(jí)特大地震影響涨颜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茧球,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一庭瑰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抢埋,春花似錦弹灭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至饥努,卻和暖如春捡鱼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酷愧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工驾诈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溶浴。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓翘鸭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親戳葵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子就乓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容