Squirrel Framework – 是一个轻量级的 MongoDB 存储封装类库。同时,它还尝试为使用者提供了一系列的拓展类,方便日常的 .NET 开发需求。它致力于让你轻松、快速地构建基于 MongoDB 的应用程序。
下面我们简单介绍一下 Squirrel Framework 的核心功能,只要以下 4 个步骤,你就能完成持久化层的开发。
你可以在这里查看它的全部实现:https://github.com/imnista/SquirrelFramework
开始行动
- 新建一个 .NET 工程,请确认该工程所选目标框架是 .NET Core 2.0 或 .NET Framework 4.6.1 及其后续版本
-
通过搜索关键字 “SquirrelFramework” 下载本类库的 Nuget Package。你也可以使用 Package Manager 通过执行以下命令完成包下载
PM> Install-Package SquirrelFramework -Version 1.0.15.1
-
创建实体类
using SquirrelFramework.Domain.Model; [Database("YourDatabaseName")] [Collection("UsersCollectionName")] public class User : DomainModel { public string Name { get; set; } public string Gender { get; set; } public int Age { get; set; } }
[Database] 自定义特性并不是必须的,你可以在 “/Config/mongodb.config” 配置 MongoDB 的默认数据库名。[Collection] 自定义特性则用于指定实体类对应的 MongoDB 表名,
它是必须的。【从 1.0.14 版本开始,[Collection] 标签不再是必须的,如果你没有通过它指定表名称,则这个 DomainModel 的类名将直接作为表名称】 -
创建你的 MongoDB 数据操作类
using SquirrelFramework.Repository; public class UserRepository: RepositoryBase<User> {}
没错,就这么简单!
-
就这样,大功告成!开始你的增删改查!这里是一些例子:
var userRepo = new UserRepository();
-
新增加一位 User
userRepo.Add(new User{ Name = "Hendry", Gender = "Male", Age = 18, Geolocation = new Geolocation(121.551949, 38.890957) });
-
获取所有以我当前 GPS 坐标为中心,2 公里内的所有 User
userRepo.GetNearBy(new Geolocation(121.551949, 38.890957), 2000);
-
异步地删除所有年龄大于 25岁的 User
userRepo.DeleteManyAsync(u => u.Age > 25);
-
按照 Age 字段降序排列分页(每页 15 条记录),获取其第三页的所有 User 数据
// 方法签名 // public IEnumerable<TDomain> GetAllByPageSortBy( // int pageIndex, // int pageSize, // Expression<Func<TDomain, object>> sortBy, // bool isSortByDescending = false // ); userRepo.GetAllByPageSortBy(2, 15, u => u.Age, true);
-
一些拓展
-
如果你数据库的表名字是动态的(比如分表场景)。例如,你正在按月存储你的用户信息:
* Users201801
* Users201802
* Users201803
* …你可以改用 CustomizedRepositoryBase 类作为基类。
public class UserRepository: CustomizedRepositoryBase<User> {}
随后,在进行数据库操作时,你可以动态地指定表名。例如,新增一条 User 记录到 201805 表
var userRepo = new UserRepository(); userRepo.Add("Users201805", new User{ Name = "Hendry", Gender = "Male", Age = 18, Geolocation = new Geolocation(121.551949, 38.890957) });
-
快速创建 Domain Service
当然,这不是必需的,如果你打算用到它,只要如下一行代码即可。public class UserService : ServiceBase<User, UserRepository> {}
获取最新包
你可以随时从 Nuget.org 官方网站获取最新的 SquirrelFramework 包
[Database(“YourDatabaseName”)]
[Collection(“UsersCollectionName”)]
public class User : DomainModel
{
public string Name { get; set; }
public string Gender { get; set; }
public int Age { get; set; }
}
这种属性注释声明方式:有点代码污染,Entity Framework提供一套Entity Fluent API方式,将注释声明转移到一个配置约定Class里,DB在初始化是,加载所有的配置约定类,来构建存储模型结构。消除了Domain Class代码污染性。
好极了!我会加到近期的版本计划里
userRepo.Add(“Users201805”, new User{
Name = “Hendry”,
Gender = “Male”,
Age = 18,
Geolocation = new Geolocation(121.551949, 38.890957)
});
分表存储,实质是一种垂直结构化存储,可以衍生一个PartitionKey,PartitionKey通过一种算法或一些规则来生成,如年月,或者特征数据(租户ID) Hash生成。使用的时候通过统一的方式获取。
已记录,1.0.17 版本会提供此功能!
Hello. And Bye.