RJCore 1.2.1

There is a newer version of this package available.
See the version list below for details.
dotnet new install RJCore::1.2.1                
This package contains a .NET Template Package you can call from the shell/command line.

分层模板说明

├─Domain
├─Data
├─Api
├─Tests

分层说明

Data 引用 Domain 层 Api 引用 Domain + Data 层 Tests 单元测试,按需引用对应层

  1. Api层不应直接访问数据层,而是通过 Supervisor。 Supervisor在Domain中定义接口与实现。
  2. Domain 不进行严格的DDD分层,可以将接口、通用方法、实体、Dto 等包含于此。
  3. Data 入参不要求严格的 DDD 分层(及Abp中良好实践中所说的Contracts中的入参不应在数据层中被直接使用),可以入参传入到数据层。如查询参数定义为一个类后,该类可以在数据层作为入参,不需要拆分定义入参参数。
//BillBankPageInputDto 就是Contracts定义的Api入参,可以传到数据层。
public async Task<PageResultDto<BillBank>> GetPageAsync(BillBankPageInputDto input, CancellationToken ct = default)
{

}
  1. 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

  1. Dapper 使用者最多,是FreeSql与SqlSugar总和的10倍以上。 Dapper在原生sql上有良好实践。只用sql语句时仍推荐Dapper。
  2. Dapper 的Lambda 用法需要使用扩展, 对应扩展只包含基础的CRUD,功能远比 FreeSql、SqlSugar 少, 语法也不顺畅。
  3. 从Dapper 迁移到 FreeSql,最为容易。
  4. 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.

Version Downloads Last updated
2.0.0 711 3/1/2024
1.2.1 240 7/4/2023
1.2.0 215 7/3/2023
1.1.0 418 11/10/2022
1.0.0 474 3/20/2022