.NET Core MongoDB的简单使用

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: .NET Core MongoDB的简单使用

一、创建测试库、测试表、添加测试数据

使用之前文章提到的MongoDB Compass用法分别添加数据库[myDb]和集合(表)[userinfos]信息,

参考链接为:MongoDB Compass的安装及使用图文说明(非常详细),同时数据库连接语句也可从MongoDB Compass中获得

image.gif

使用mongo shell命令添加测试数据

image.gif

添加完成,MongoDB Compass中可看到已添加的数据

image.gif

二、新建ASP.NET Core Web API项目

1、使用NuGet包管理器添加MongoDB.Driver

image.gif

2、编写demo示例

1)插入

向myDb.userinfos中插入一条数据

/// <summary>
/// 插入数据demo(仅可执行一次)
/// </summary>
[HttpGet, HttpPost]
public void InsertDemo()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // 待添加的document
    // 待添加的document
    var doc = new BsonDocument {
        { "_id", 7 },
        { "name", "吴九" },
        { "age", 29 },
        { "ename", new BsonDocument
            {
                { "firstname", "jiu" },
                { "lastname", "wu" }
            }
        }
    };
    // InsertOne() 添加单条document
    mycollection.InsertOne(doc);
    // 添加多条document
    //mycollection.InsertMany(IEnumerable<BsonDocument> docs);
}

image.gif

在MongoDB compass中可以看到新增的数据

image.gif

2)查询

①  简单查询

/// <summary>
/// 简单查询(Find)
/// </summary>
[HttpGet, HttpPost]
public void SearchByFindOrFilter()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // Filter用于过滤,如查询name = '吴九' 的第一条记录
    var filter = Builders<BsonDocument>.Filter;
    // Find(Filter)进行查询
    var doc = mycollection.Find(filter.Eq("name", "吴九")).FirstOrDefault();
    Console.WriteLine("简单查询结果:" + doc);
}

image.gif

简单查询结果为:

image.gif ②  AND查询

/// <summary>
/// AND查询
/// </summary>
[HttpGet, HttpPost]
public void SearchByAnd()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // 查询年龄大于25且小于28的记录
    var filter = Builders<BsonDocument>.Filter;
    var docs = mycollection.Find(filter.Gt("age", 25) & filter.Lt("age", 28)).ToList();
    Console.WriteLine("AND查询结果:" + d)
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

AND查询结果为:

image.gif

③  OR查询

/// <summary>
/// OR查询
/// </summary>
[HttpGet, HttpPost]
public void SearchByOr()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // 查询年龄小于25或大于28的记录
    var filter = Builders<BsonDocument>.Filter;
    var docs = mycollection.Find(filter.Lt("age", 25) | filter.Gt("age", 28)).ToList();
    Console.WriteLine("OR查询结果为:");
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

OR查询结果为:

image.gif ④  字段存在(Exists)

/// <summary>
/// 字段存在(Exists)
/// </summary>
[HttpGet, HttpPost]
public void SearchIsExists()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // 查询存在address字段的记录
    var filter = Builders< BsonDocument>.Filter;
    var docs = mycollection.Find(filter.Exists("address")).ToList();
    Console.WriteLine("存在address记录的查询结果为:");
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

字段存在(Exists)的查询结果为:

image.gif

⑤  排序(Sort)

/// <summary>
/// 排序(Sort)
/// </summary>
[HttpGet, HttpPost]
public void SearchWithSort()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // 查询age<26的记录,按年龄倒序排列
    var filter = Builders <BsonDocument>.Filter;
    var sort = Builders <BsonDocument>.Sort;
    var docs = mycollection.Find(filter.Lt("age", 26)) // 过滤
        .Sort(sort.Descending("age")) // 排序
        .ToList();
    Console.WriteLine("排序的查询结果为:");
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

排序(Sort)的查询结果为:

image.gif

⑥  查询指定字段(Projection)

/// <summary>
/// 查询指定字段(Projection)
/// </summary>
[HttpGet, HttpPost]
public void SearchWithSpecifyField()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // 查询age<26的记录,包含name、age,排除 _id
    var filter = Builders<BsonDocument>.Filter;
    var project = Builders<BsonDocument>.Projection;
    var docs = mycollection.Find(filter.Lt("age", 26)) // 过滤
        .Project(project.Include("name") // 包含name
            .Include("age") // 包含age
            .Exclude("_id")) // 包含_id
        .ToList();
    Console.WriteLine("查询指定字段的查询结果为:");
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

查询指定字段(Projection)的查询结果为:

image.gif3)修改

①  修改单条记录(UpdateOne)

/// <summary>
/// 修改单条记录(UpdateOne)
/// </summary>
[HttpGet, HttpPost]
public void UpdateOneRecord()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument > ("userinfos");
    var filter = Builders<BsonDocument>.Filter;
    var update = Builders<BsonDocument>.Update;
    var project = Builders<BsonDocument>.Projection;
    var docBefore = mycollection.Find(filter.Eq("name", "张三")).Project(project.Include("age").Include("name")).FirstOrDefault();
    Console.WriteLine("修改前单条记录的结果为:" + docBefore);
    // 将张三的年龄改为18
    mycollection.UpdateOne(filter.Eq("name", "张三"), update.Set("age", 18));
    // 查询修改后张三的记录
    var docAfter = mycollection.Find(filter.Eq("name", "张三")).Project(project.Include("age").Include("name")).FirstOrDefault();
    Console.WriteLine("修改后单条记录的结果为:" + docAfter);
}

image.gif

修改单条记录的结果如下:

image.gif

②  修改多条记录(UpdateMany)

/// <summary>
/// 修改多条记录(UpdateMany)
/// </summary>
[HttpGet, HttpPost]
public void UpdateManyRecord()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    var filter = Builders<BsonDocument>.Filter;
    var update = Builders<BsonDocument>.Update;
    var project = Builders<BsonDocument>.Projection;
    var docBefore = mycollection.Find(filter.Empty).Project(project.Include("age").Include("name").Include("mark")) // 没有的列不会显示
        .ToList();
    Console.WriteLine("修改多条记录前的结果为:");
    docBefore.ForEach(d => Console.WriteLine(d));
    // 将所有年龄小于25的记录标记为young(如果没有mark字段会自动添加)
    UpdateResult result = mycollection.UpdateMany(filter.Lt("age", 25), update.Set("mark", "young"));
    if(result.IsModifiedCountAvailable) // 获取一个表示修改后的计数是否可用的值
    {
        Console.WriteLine($ "符合条件的有{result.MatchedCount}条记录,");
        Console.WriteLine($ "一共修改了{result.ModifiedCount}条记录。");
        // 查询修改后的记录
        var docs = mycollection.Find(filter.Empty).Project(project.Include("age").Include("name").Include("mark")).ToList();
        Console.WriteLine("修改多条记录后的结果为:");
        docs.ForEach(d => Console.WriteLine(d));
    }
    else
    {
        Console.WriteLine("无修改操作!");
    }
}

image.gif

修改多条记录(UpdateMany)的结果为:

image.gif

4)删除

①  删除单条记录(DeleteOne)

/// <summary>
/// 删除单条记录(DeleteOne)
/// </summary>
[HttpGet, HttpPost]
public void DeleteOneRecord()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument> ("userinfos");
    var filter = Builders<BsonDocument>.Filter;
    var project = Builders<BsonDocument>.Projection;
    var docBefore = mycollection.Find(filter.Empty).Project(project.Include("age").Include("name").Include("mark")).ToList();
    Console.WriteLine("删除张三前的记录的结果为:");
    docBefore.ForEach(d => Console.WriteLine(d));
    // 删除名字为张三的记录
    mycollection.DeleteOne(filter.Eq("name", "张三"));
    // 查询删除张三后的记录
    var docs = mycollection.Find(filter.Empty).Project(project.Include("age").Include("name").Include("max")).ToList();
    Console.WriteLine("删除张三后的记录的结果为:");
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

删除单条记录(DeleteOne)的结果为:

image.gif

②  删除多条记录(DeleteMany)

/// <summary>
/// 删除多条记录(DeleteMany)
/// </summary>
[HttpGet, HttpPost]
public void DeleteManyRecord()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument> ("userinfos");
    var filter = Builders<BsonDocument>.Filter;
    var project = Builders<BsonDocument>.Projection;
    var docBefore = mycollection.Find(filter.Empty).Project(project.Include("age").Include("name").Include("mark")).ToList();
    Console.WriteLine("删除所有年龄大于25岁的记录前的结果为:");
    docBefore.ForEach(d => Console.WriteLine(d));
    // 删除所有年龄大于25岁的记录
    DeleteResult result = mycollection.DeleteMany(filter.Gt("age", 25));
    Console.WriteLine($ "一共删除了{result.DeletedCount}条记录");
    // 查询删除所有年龄大于25岁的记录
    var docs = mycollection.Find(filter.Empty).Project(project.Include("age").Include("name").Include("max")).ToList();
    Console.WriteLine("删除所有年龄大于25岁的记录后的结果为:");
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

删除多条记录(DeleteMany)的结果为:

image.gif

5)类型映射

①  查询结果映射到实体类示例

mongoDB支持自动映射,直接使用泛型即可

/// <summary>
/// 查询结果映射到实体类示例
/// </summary>
[HttpGet, HttpPost]
public void TypeMappingDemo()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<Userinfo>("userinfos");
    var filter = Builders<Userinfo>.Filter;
    var sort = Builders<Userinfo>.Sort;
    List<Userinfo> userinfos = mycollection.Find(filter.Lte("age", 25)) // 查询年龄小于等于25岁的记录
        .Sort(sort.Descending("age")) // 按年龄进行倒序
        .ToList();
    // 遍历结果
    userinfos.ForEach(u => Console.WriteLine($ "姓名:{u.name},年龄:{u.age},英文名:{u.ename.firstname} {u.ename.lastname}"));
    Console.ReadKey();
}

image.gif

用户信息类

/// <summary>
/// 用户信息类
/// </summary>
public class Userinfo
{
    /// <summary>
    /// id
    /// </summary>
    public int _id { get; set; }
    /// <summary>
    /// 姓名
    /// </summary>
    public string name { get; set; }
    /// <summary>
    /// 年龄
    /// </summary>
    public int age { get; set; }
    /// <summary>
    /// 等级
    /// </summary>
    public int level { get; set; }
    /// <summary>
    /// 英文名
    /// </summary>
    public Ename ename { get; set; }
    /// <summary>
    /// 角色
    /// </summary>
    public string[] roles { get; set; }
    /// <summary>
    /// 地址
    /// </summary>
    public string address { get; set; }
    /// <summary>
    /// 标记
    /// </summary>
    public string mark { get; set; }
}

image.gif

英文名类

/// <summary>
/// 英文名
/// </summary>
public class Ename
{
    /// <summary>
    /// 名
    /// </summary>
    public string firstname { get; set; }
    /// <summary>
    /// 姓
    /// </summary>
    public string lastname { get; set; }
}

image.gif

查询结果映射到实体类示例的结果为:

image.gif

②  查询结果映射到实体类示例 - 常用属性修改上方代码

上边的例子仅仅用了基本的自动化映射,使用基本的自动化映射时:类和Bson中的字段必须严格一致(_id除外,可以自动映射到_id/id/Id),且Bson中的每一个字段在实体类中都必须有一个对应的字段,不然就会抛出异常,这就造成我们可能要写一个非常庞大的实体类,而且类中的字段命名也要严格和Bson中的字段一致。这些限制对我们开发来说是不能接受的,这里我们采用mongoDriver中的一些属性改进一下上边的代码,如下:

/// <summary>
/// 查询结果映射到实体类示例 - 常用属性修改上方代码
/// </summary>
[HttpGet, HttpPost]
public void TypeMappingWithCommonAttributes()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<UserinfoBson>("userinfos");
    var filter = Builders<UserinfoBson>.Filter;
    var sort = Builders<UserinfoBson>.Sort;
    List<UserinfoBson> userinfos = mycollection.Find(filter.Lte("age", 25)) // 查询年龄小于等于25岁的记录
        .Sort(sort.Descending("age")) // 按年龄进行倒序
        .ToList();
    // 遍历结果
    userinfos.ForEach(u =>
    {
        Console.WriteLine($ "编号:{u.userId},姓名:{u.name},年龄:{u.age},英文名:{u.ename?.ming} {u.ename.xing},性别:{u.gender}");
        Console.WriteLine($ "其他属性:{u.otherprops}");
        Console.WriteLine();
    });
    Console.ReadKey();
}

image.gif

用户信息类 - Bson

/// <summary>
/// 用户信息类 - Bson
/// </summary>
public class UserinfoBson
{
    /// <summary>
    /// id
    /// </summary>
    [BsonId] // BsonId修饰的字段对应BsonDocument中的_id;
    public int userId { get; set; }
    /// <summary>
    /// 姓名
    /// </summary>
    public string name { get; set; }
    /// <summary>
    /// 年龄
    /// </summary>
    public int age { get; set; }
    /// <summary>
    /// 英文名
    /// </summary>
    public EnameBson ename { get; set; }
    /// <summary>
    /// 性别
    /// </summary>
    [BsonDefaultValue('男')] // BsonDefaultValue(value)用于指定默认值;
    public char gender { get; set; }
    /// <summary>
    /// 昵称
    /// </summary>
    [BsonIgnore] // BsonIgnore表示不映射,即使BsonDocument中包含该字段也不会赋值给属性;
    public string nickname { get; set; }
    /// <summary>
    /// 其他属性
    /// </summary>
    [BsonExtraElements] // BsonExtraElements修饰的字段用于存储没有映射到类中的其他属性;
    public BsonDocument otherprops { get; set; }
}

image.gif

英文名类 - Bson

/// <summary>
/// 英文名 - Bson
/// </summary>
public class EnameBson
{
    /// <summary>
    /// 名
    /// </summary>
    [BsonElement("firstname")] // BsonElement可以指定修饰的属性映射到BsonDocument中的哪个字段
    public string ming { get; set; }
    /// <summary>
    /// 姓
    /// </summary>
    [BsonElement("lastname")]
    public string xing { get; set; }
}

image.gif

查询结果映射到实体类示例 - 常用属性修改上方代码的结果为:

image.gif

6)使用LINQ查询

①  基本查询:查找年龄大于22岁的学生;②  连接查询:查询各个学生的学号、姓名、班级名

/// <summary>
/// 使用LINQ查询
/// </summary>
[HttpGet, HttpPost]
public void LINQQuery()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var stuCollection = mydb.GetCollection<Student> ("students");
    var clsCollection = mydb.GetCollection <Classx> ("classes");
    //查找年龄大于22的学生
    Console.WriteLine("-------------查找年龄大于22的学生列表--------------");
    //1.query语法
    List<Student> stuList1 = (from stu in stuCollection.AsQueryable() where stu.age > 22 select stu).ToList();
    //2.点语法
    List<Student> stuList2 = stuCollection.AsQueryable().Where(s => s.age > 22).ToList();
    stuList1.ForEach(stu => Console.WriteLine($ "姓名:{stu?.stuName},  年龄:{stu?.age}"));
    Console.WriteLine();
    //表连接查询,查询各个学生的班级名
    Console.WriteLine("-------------表连接,查询学生的班级名----------------");
    //1.query语法
    var result1 = from stu in stuCollection.AsQueryable()
    join cls in clsCollection.AsQueryable()
    on stu.classNo equals cls.no
    select new
    {
        stuno = stu.no, stu.stuName, cls.clsName
    };
    //2.点语法
    var result2 = stuCollection.AsQueryable().Join(clsCollection.AsQueryable(), stu => stu.classNo, cls => cls.no, (stu, cls) => new
    {
        stuno = stu.no, stu.stuName, cls.clsName
    });
    //遍历结果
    foreach(var item in result1)
    {
        Console.WriteLine($ "学号:{item.stuno}, 姓名:{item.stuName}, 班级:{item.clsName}");
    }
    Console.ReadKey();
}

image.gif

学生类

/// <summary>
/// 学生类
/// </summary>
public class Student
{
    /// <summary>
    /// 学号
    /// </summary>
    public int no
    { get; set; }
    /// <summary>
    /// 姓名
    /// </summary>
    public string stuName
    { get; set; }
    /// <summary>
    /// 年龄
    /// </summary>
    public int age { get; set; }
    /// <summary>
    /// 班级编号
    /// </summary>
    public int classNo { get; set; }
    /// <summary>
    /// 其他
    /// </summary>
    [BsonExtraElements]
    public BsonDocument others { get; set; }
}

image.gif

班级类

/// <summary>
/// 班级类
/// </summary>
public class Classx
{
    /// <summary>
    /// 班级编号
    /// </summary>
    public int no { get; set; }
    /// <summary>
    /// 班级名
    /// </summary>
    public string clsName { get; set; }
    /// <summary>
    /// 其他
    /// </summary>
    [BsonExtraElements]
    public BsonDocument others { get; set; }
}

image.gif

查找年龄大于22岁的学生以及查询各个学生的学号、姓名、班级名的结果如下:

image.gif

三、附录

1、userinfos表测试数据

use myDb
db.userinfos.insertMany([
   {_id:1, name: "张三", age: 23,level:10, ename: { firstname: "san", lastname: "zhang"}, roles: ["vip","gen" ]},
   {_id:2, name: "李四", age: 24,level:20, ename: { firstname: "si", lastname: "li"}, roles:[ "vip" ]},
   {_id:3, name: "王五", age: 25,level:30, ename: { firstname: "wu", lastname: "wang"}, roles: ["gen","vip" ]},
   {_id:4, name: "赵六", age: 26,level:40, ename: { firstname: "liu", lastname: "zhao"}, roles: ["gen"] },
   {_id:5, name: "田七", age: 27, ename: { firstname: "qi", lastname: "tian"}, address:'北京' },
   {_id:6, name: "周八", age: 28,roles:["gen"], address:'上海' }
])

image.gif

2、student表测试数据

db.students.insertMany([
    {"no":1, "stuName":"jack", "age":23, "classNo":1},
    {"no":2, "stuName":"tom", "age":20, "classNo":2},
    {"no":3, "stuName":"hanmeimei", "age":22, "classNo":1},
    {"no":4, "stuName":"lilei", "age":24, "classNo":2}
    ])

image.gif

3、classs表测试数据

db.classes.insertMany([
    {"no" : 1,"clsName" : "A班"},
    {"no" : 2,"clsName" : "B班"}
    ])

image.gif

4、 MongoDB .NET Driver官方文档:http://mongodb.github.io/mongo-csharp-driver/

以上就是.NET Core MongoDB的简单使用的介绍,做此记录,如有帮助,欢迎点赞关注收藏!

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
18天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
38 5
|
2月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
2天前
|
存储 NoSQL MongoDB
.NET MongoDB数据仓储和工作单元模式封装
.NET MongoDB数据仓储和工作单元模式封装
34 15
|
1月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
43 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
26天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
26 3
|
2天前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
14 0
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
9天前
|
存储 JSON NoSQL
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
44 15
|
17天前
|
存储 NoSQL 关系型数据库
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
我们的风控系统引入阿里云数据库MongoDB版后,解决了特征类字段灵活加减的问题,大大提高了开发效率,极大的提升了业务用户体验,获得了非常好的效果
阿里云数据库MongoDB版助力信也科技 打造互联网金融企业样板
|
1月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。