RJCore 1.2.1
See the version list below for details.
dotnet new install RJCore::1.2.1
分层模板说明
├─Domain
├─Data
├─Api
├─Tests
分层说明
Data 引用 Domain 层 Api 引用 Domain + Data 层 Tests 单元测试,按需引用对应层
- Api层不应直接访问数据层,而是通过 Supervisor。 Supervisor在Domain中定义接口与实现。
- Domain 不进行严格的DDD分层,可以将接口、通用方法、实体、Dto 等包含于此。
- Data 入参不要求严格的 DDD 分层(及Abp中良好实践中所说的Contracts中的入参不应在数据层中被直接使用),可以入参传入到数据层。如查询参数定义为一个类后,该类可以在数据层作为入参,不需要拆分定义入参参数。
//BillBankPageInputDto 就是Contracts定义的Api入参,可以传到数据层。
public async Task<PageResultDto<BillBank>> GetPageAsync(BillBankPageInputDto input, CancellationToken ct = default)
{
}
- Domain、Data、Api 均引用统一输出结果包,对响应进行统一的结构输出。该报也提供了数据层的基础分页定义。
<PackageReference Include="Infrastructure.UnifiedOutput" Version="1.1.4" />
4.1 PageResultDto<T> 和 Result.Page(该页记录,总数)
public async Task<PageResultDto<BillBank>> GetPageAsync(BillBankPageInputDto input, CancellationToken ct = default)
{
var items = await _fsql.Use(Databases.Default)
.Select<BillBank>()
.Where(x => x.BankName.Contains(""))
.Count(out var total)
.Page(input.PageIndex, input.PageSize)
.ToListAsync();
return Result.Page(items, total);
}
Domain 层
├─Domain
├─Connection
├─IDbConnectionFactory.cs //数据库连接接口定义【注:使用freeSqlCloud替代lconnection创建】
├─CustomFreeSqlCloud.cs //FreeSqlCloud
├─Consts //常量定义
├─Contracts //Dto(接口出入参定义)
├─Converters //实体与Dto互转
├─Entities //实体
├─Enums //枚举
├─Extensions //方法扩展
├─Repositories //数据层接口定义,按对应边界划分(如一表一个)
├─Supervior //Supervisor , Api 层调用数据层,统一从Supervisor 进行调用
├─Implements //只有一份对 ISupervisor 的实现,用 partial 关键字拆分文件,一份文件对应一份 Repository 的实现
├─Interfaces //只有一个 ISuperviosr接口,用 partial 关键字拆分文件,一份文件对应一份IRepository的接口
Data 层
├─Domain
├─Connection
├─SqlServerConnectionFactory.cs //数据库连接实现--sqlServer (默认使用FreeSql, 使用FreeSql引用的 Microsoft.Data.SqlClient 进行连接)
//oracle,mysql等按需添加
├─Repositories //数据层实现
Oracle连接示例
using Oracle.ManagedDataAccess.Client;
/// <summary>
/// Oracle 数据库连接工厂
/// </summary>
public class OracleConnectionFactory : IDbConnectionFactory
{
private readonly string _connectionString;
public OracleConnectionFactory(string connectionString)
{
_connectionString = connectionString;
}
/// <summary>
/// 创建Oracle数据库连接
/// </summary>
/// <returns></returns>
public IDbConnection CreateConnection()
{
var conn = new OracleConnection(_connectionString);
conn.Open();
return conn;
}
}
FreeSql 为推荐 ORM
- Dapper 使用者最多,是FreeSql与SqlSugar总和的10倍以上。 Dapper在原生sql上有良好实践。只用sql语句时仍推荐Dapper。
- Dapper 的Lambda 用法需要使用扩展, 对应扩展只包含基础的CRUD,功能远比 FreeSql、SqlSugar 少, 语法也不顺畅。
- 从Dapper 迁移到 FreeSql,最为容易。
- SqlSugar 官网太丑,FreeSql 官网更显专业。
Api 层
├─Api
├─Attributes
├─ThreadIdEnricher.cs //Serilog日志记录进程Id (时间相近的日志可以更好区分跟踪)
├─ValidationOutputAttribute.cs //禁用.netcore 默认参数校验后,用此Attribute进行参数校验不通过的统一响应
├─Configurations //Repositories、Supervisor等的依赖注入
├─Controllers //Api接口
├─appsettings.json //配置,注敏感信息应避免明文配置,可以使用VisualStudiao -右键 - 管理用户机密来仅本地存储
├─secrets.json //右键 - 管理用户机密 打开,因只本地存储,可以确保相关安全。但也要注意开发过程不应配置到生产环境,否则不易察觉。
├─Program.cs
├─WeatherForecast.cs //默认天气接口,保留即可。作为健康检测的服务接口。
接口调用凭证
依赖包:Infrastructure.AccessToken.Authorization
<PackageReference Include="Infrastructure.AccessToken.Authorization" Version="1.0.0" />
使用说明详见: Infrastructure.AccessToken.Authorization
多个数据库连接
//freesql的多实例注入
builder.Services.ConfigureFreeSqls(Configuration);
public static IServiceCollection ConfigureFreeSqls(this IServiceCollection services, IConfiguration configuration)
{
var fsql = new CustomFreeSqlCloud();
fsql.Register(Databases.Default, () => new FreeSqlBuilder()
.UseConnectionString(DataType.SqlServer, configuration["ConnectionStrings:DefaultContext"].ToString())
.Build());
fsql.Register(Databases.HR, () => new FreeSqlBuilder()
.UseConnectionString(DataType.SqlServer, configuration["ConnectionStrings:ContextHR"].ToString())
.Build());
fsql.Register(Databases.Public, () => new FreeSqlBuilder()
.UseConnectionString(DataType.SqlServer, configuration["ConnectionStrings:ContextPublicDb"].ToString())
.Build());
services.AddSingleton<IFreeSql>(fsql);
services.AddSingleton(fsql);
return services;
}
/*end 数据库连接*/
校验失败统一输出
builder.Services.AddControllers(options => {
//使用统一结构响应输出参数验证不通过的情况
options.Filters.Add<ValidationOutputAttribute>();
}).AddNewtonsoftJson(); //.AddNewtonsoftJson(); 对JsonIgnore等生效
// 禁用默认校验
builder.Services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
接口加密输入与加密输出(可选)
依赖包:Infrastructure.Utils.EncryptFilter
<PackageReference Include="Infrastructure.Utils.EncryptFilter" Version="1.0.0" />
加密输入与输出默认不启用,需要时进行对应反注解
//加密请求时才使用
//builder.Services.AddScoped<DecryptInputActionFilter>();
//加密输出时才使用
//builder.Services.AddScoped<EncryptOutputActionFilter>();
[HttpPost]
//[ServiceFilter(typeof(DecryptInputActionFilter))] //加密请求进行解密时加此行
[HttpGet]
//[ServiceFilter(typeof(EncryptOutputActionFilter))]//加密输出时加此行
Tests层
进行必要的单元测试、方法测试验证等。
-
.NETStandard 2.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.