学习C#—ABP vNext框架:第三章(使用DDD领域驱动设计实现.NetCoreApi项目)

934 阅读4分钟

一、搭建项目

1、创建webApi项目 (.net6.0以上版本)

image.png

2、引入管理Nuget包

image.png

3、自定义IOC模板依赖Abp_vNext IOC模板

3.1、 使用DependsOn特性注入模板(注意:DependsOn的命名空间所在using Volo.Abp.Modularity;)

[DependsOn(
    typeof(AbpAutofacModule),//依赖ABP 的IOC容器模板
    typeof(AbpAspNetCoreMvcModule)//依赖ABP的 MVC模板
)]
public class ABP_vNext_Shop_Module : AbpModule //继承apb的模块模板
{
    //重写项目配置方法
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        context.Services.AddControllers();
        context.Services.AddEndpointsApiExplorer();
        context.Services.AddSwaggerGen(options =>
        {
            //4.2、 配置自动生成API控制器 显示在swagger页面上
            options.DocInclusionPredicate((document, api) => true);
        });

        //1、加载Abp_ServerContext到IOC容器
        context.Services.AddAbpDbContext<Abp_ServerContext>();

        //2、加载DbContext对应的数据库
        //以mysql为例
        Configure<AbpDbContextOptions>(options =>
        {
            options.UseMySQL();
        });

        //3、加载AutoMapper到IOC容器
        context.Services.AddAutoMapperObjectMapper<Abp_ServerContext>();
        //3.1、 配置AutoMapper
        Configure<AbpAutoMapperOptions>(options =>
        {
            //对整个项目进行映射
            options.AddMaps<ABP_vNext_Shop_Module>();
        });

        //4、配置自动API控制器生成
        Configure<AbpAspNetCoreMvcOptions>(options =>
        {
            //4.1、开启自动API控制器 => 集成整个项目所有控制器
            options.ConventionalControllers.Create(typeof(ABP_vNext_Shop_Module).Assembly, options =>
            {
                //自定义指定 自动生成的api路由的项目名称
                options.RootPath = "ABP_vNext_Shop";

                ////自动api都创建,为true不过滤,为false全部过滤
                ////非特殊特情况,不要使用这种方式,会写死
                //options.TypePredicate = type => true;
            });
        });

    }
    
    //重写项目驱动方法
    public override void OnApplicationInitialization(ApplicationInitializationContext context)
    {
        //获取app
        var app = context.GetApplicationBuilder();
        //获取环境
        var env = context.GetEnvironment();
        if (env.IsDevelopment())
        {
            app.UseSwagger();
            app.UseSwaggerUI();
        }

        app.UseHttpsRedirection();

        app.UseAuthorization();


    }
}

3.2、 更改原有的Program文件

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        //1、加载ABP_vNext_Shop_Module类
        builder.Services.AddApplication<ABP_vNext_Shop_Module>();
        //2、将项目原有的add方法放到ABP_vNext_Shop_Module类重写的ConfigureServices方法中

        //5、集成Autofac
        builder.Host.UseAutofac();

        var app = builder.Build();

        //3、加载中间件
        app.InitializeApplication();
        //4、将项目原有的Use方法放到ABP_vNext_Shop_Module类重写的OnApplicationInitialization方法中

        app.MapControllers();

        app.Run();
    }
}

二、使用DDD领域驱动设计搭建项目结构

image.png 1、数据库上下文Abp_ServerContext

/// <summary>
/// 数据库上下文类
/// [ConnectionStringName("MySQLUrlStr")] 特性: 指定数据库连接字符串
/// </summary>
[ConnectionStringName("MySQLUrlStr")]
public class Abp_ServerContext : AbpDbContext<Abp_ServerContext>
{
    //重写构造函数
    public Abp_ServerContext(DbContextOptions<Abp_ServerContext> options) : base(options)
    {
    }
    
    //用户表
    public  DbSet<Users> Users { get; set; }
}

2、配置使用上下文信息

  [DependsOn(
    typeof(AbpAutofacModule),//依赖ABP 的IOC容器模板
    typeof(AbpAspNetCoreMvcModule),//依赖ABP的 MVC模板
    typeof(AbpEntityFrameworkCoreModule),//依赖ABP的 EF-Core模板
    typeof(AbpEntityFrameworkCoreMySQLModule),//依赖ABP的 EF-Core-MySQL模板
    typeof(AbpDddApplicationModule),//依赖ABP的 ApplicationModule模板
    typeof(AbpAutoMapperModule)//依赖ABP的 AutoMapper自动映射模板
    )]
public class ABP_vNext_Shop_Module : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        context.Services.AddControllers();
        context.Services.AddEndpointsApiExplorer();
        context.Services.AddSwaggerGen(options =>
        {
            //4.2、 配置自动生成API控制器 显示在swagger页面上
            options.DocInclusionPredicate((document, api) => true);
        });

        //1、加载Abp_ServerContext到IOC容器
        context.Services.AddAbpDbContext<Abp_ServerContext>();

        //2、加载DbContext对应的数据库
        //以mysql为例
        Configure<AbpDbContextOptions>(options =>
        {
            options.UseMySQL();
        });

        //3、加载AutoMapper到IOC容器
        context.Services.AddAutoMapperObjectMapper<Abp_ServerContext>();
        //3.1、 配置AutoMapper
        Configure<AbpAutoMapperOptions>(options =>
        {
            //对整个项目进行映射
            options.AddMaps<ABP_vNext_Shop_Module>();
        });

        //4、配置自动API控制器生成
        Configure<AbpAspNetCoreMvcOptions>(options =>
        {
            //4.1、开启自动API控制器 => 集成整个项目所有控制器
            options.ConventionalControllers.Create(typeof(ABP_vNext_Shop_Module).Assembly, options =>
            {
                //自定义指定 自动生成的api路由的项目名称
                options.RootPath = "ABP_vNext_Shop";

                ////自动api都创建,为true不过滤,为false全部过滤
                ////非特殊特情况,不要使用这种方式,会写死
                //options.TypePredicate = type => true;
            });
        });

    }

    public override void OnApplicationInitialization(ApplicationInitializationContext context)
    {
        //获取app
        var app = context.GetApplicationBuilder();
        //获取环境
        var env = context.GetEnvironment();
        if (env.IsDevelopment())
        {
            app.UseSwagger();
            app.UseSwaggerUI();
        }

        app.UseHttpsRedirection();

        app.UseAuthorization();


    }
}

3、生成上下文迁移文件 在项目所在目录,使用命令窗口,执行命令: dotnet ef add 迁移文件名称 -c 指定要迁移的上下文Dbcontext

4、实体数据表Models

   public class Users : Entity<int>//继承领域层的泛型主键Id
    {
        public string Name { get; set; }
   
        public string Password { get; set; }
   
        public string Email { get; set; }
   
        public string Icon { get; set; }
    }

5、仓储层Respository

5.1、仓储层接口定义

/// <summary>
/// 用户仓储
/// </summary>
public interface IUserRespository: IRepository<Users, int>
{

}

5.2、仓储实现

    /// <summary>
    /// 用户仓储实现,相当于三层架构的DAL 访问数据库使用
    /// </summary>
    [Dependency(ServiceLifetime.Singleton)] //特性依赖注入
    public class UserRespository : EfCoreRepository<Abp_ServerContext, Users, int>, IUserRespository//继承仓储接口,abp封装的ef仓储接口
    {
        //重写构造函数,实现父类构造
        public UserRespository(IDbContextProvider<Abp_ServerContext> dbContextProvider) : base(dbContextProvider)
        {
        }
    }

6、实现层Service 6.1、实现层服务接口

 /// <summary>
/// 用户服务接口
/// </summary>
public interface IUserService:ICrudAppService<UsersDto, int>//继承abp封装的领域驱动应用层的增删改查接口
{
}

6.2、实现服务接口

/// <summary>
/// 用户服务实现: 相当于三层架构的BLL,写业务逻辑的地方
/// </summary>
[Dependency(ServiceLifetime.Singleton)]//特性依赖注入单例
public class UserService : CrudAppService<Users, UsersDto, int>, IUserService,IRemoteService//继承abp封装的领域驱动应用层的增删改查实现,继承用户接口,继承IRemoteService自动生成API控制器不用手动创建
{
    //重写构造函数 实现父类构造
    public UserService(IUserRespository userService) : base(userService)
    {
    }
}

7、数据转换映射层AutoMap

 /// <summary>
/// 配置自动映射: DTO => 实体数据表
/// </summary>
public class Abp_AutoMapper: Profile//继承abp封装的模型转换映射模板Profile
{
    //重写构造函数,创建映射
    public Abp_AutoMapper()
    {
        CreateMap<UsersDto, Users>();
        CreateMap<Users, UsersDto>();
    }
}

三、效果展示

image.png image.png

以上就是初步了解的使用DDD领域驱动设计实现.NetCoreApi项目,欢迎大家到评论区一起研究!!