一、搭建项目
1、创建webApi项目 (.net6.0以上版本)
2、引入管理Nuget包
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领域驱动设计搭建项目结构
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>();
}
}
三、效果展示
以上就是初步了解的使用DDD领域驱动设计实现.NetCoreApi项目,欢迎大家到评论区一起研究!!