ASP.NET Boilerplate 入门教程:基于ASP.NET Core与EF Core构建多层Web应用(第一部分)
引言
本文将介绍如何使用ASP.NET Boilerplate框架结合ASP.NET Core和Entity Framework Core构建一个多层Web应用程序。这是系列教程的第一部分,我们将创建一个简单的任务管理系统作为示例项目。
技术栈概览
我们将使用以下技术栈:
- .NET Core:跨平台应用开发框架
- ASP.NET Boilerplate:应用框架和启动模板
- ASP.NET Core:Web框架
- Entity Framework Core:ORM框架
- Bootstrap:前端HTML/CSS框架
- jQuery:客户端AJAX/DOM库
- xUnit和Shouldly:用于单元测试和集成测试
架构设计原则
项目将采用以下架构设计原则:
- 分层架构:清晰分离表现层、应用层、领域层和基础设施层
- 领域驱动设计(DDD):以业务领域为核心组织代码结构
- 依赖注入(DI):实现松耦合的组件设计
- 集成测试:确保各层组件协同工作正常
环境准备
开发工具要求
在开始之前,请确保已安装:
- Visual Studio 2017或更高版本
- SQL Server(可使用LocalDB替代)
- 推荐Visual Studio扩展:
- Bundler & Minifier
- Web Compiler
创建应用程序
我们使用ASP.NET Boilerplate的启动模板创建一个名为"Acme.SimpleTaskApp"的Web应用程序。选择"多页面Web应用"模板,并暂时禁用身份验证功能以获得最基础的启动模板。
解决方案结构
模板创建的项目包含6个核心项目:
- Core:领域/业务层(实体、领域服务等)
- Application:应用层(DTO、应用服务等)
- EntityFramework:EF Core集成层
- Web:ASP.NET MVC表现层
- Tests:单元和集成测试(不包括Web层)
- Web.Tests:ASP.NET Core集成测试(包含Web层)
开发任务管理功能
创建任务实体
我们从创建简单的Task实体开始,该实体属于领域层,因此放在.Core项目中:
[Table("AppTasks")]
public class Task : Entity, IHasCreationTime
{
public const int MaxTitleLength = 256;
public const int MaxDescriptionLength = 64 * 1024; //64KB
[Required]
[StringLength(MaxTitleLength)]
public string Title { get; set; }
[StringLength(MaxDescriptionLength)]
public string Description { get; set; }
public DateTime CreationTime { get; set; }
public TaskState State { get; set; }
public Task()
{
CreationTime = Clock.Now;
State = TaskState.Open;
}
}
public enum TaskState : byte
{
Open = 0,
Completed = 1
}
关键点说明:
- 继承自ABP的Entity基类,默认包含int类型的Id属性
- 实现IHasCreationTime接口,标准化创建时间字段
- 使用Clock.Now而非DateTime.Now,便于未来切换时区
- 通过Table特性指定数据库表名
配置DbContext
在EntityFramework项目中,我们需要将Task实体添加到DbContext:
public class SimpleTaskAppDbContext : AbpDbContext
{
public DbSet<Task> Tasks { get; set; }
public SimpleTaskAppDbContext(DbContextOptions<SimpleTaskAppDbContext> options)
: base(options)
{
}
}
数据库迁移
- 使用Add-Migration命令创建初始迁移
- 使用Update-Database命令应用迁移并创建数据库
迁移完成后,数据库中将创建AppTasks表,我们可以手动添加一些测试数据。
实现应用服务层
定义应用服务接口
public interface ITaskAppService : IApplicationService
{
Task<ListResultDto<TaskListDto>> GetAll(GetAllTasksInput input);
}
定义DTO
public class GetAllTasksInput
{
public TaskState? State { get; set; }
}
[AutoMapFrom(typeof(Task))]
public class TaskListDto : EntityDto, IHasCreationTime
{
public string Title { get; set; }
public string Description { get; set; }
public DateTime CreationTime { get; set; }
public TaskState State { get; set; }
}
实现应用服务
public class TaskAppService : SimpleTaskAppAppServiceBase, ITaskAppService
{
private readonly IRepository<Task> _taskRepository;
public TaskAppService(IRepository<Task> taskRepository)
{
_taskRepository = taskRepository;
}
public async Task<ListResultDto<TaskListDto>> GetAll(GetAllTasksInput input)
{
var tasks = await _taskRepository
.GetAll()
.WhereIf(input.State.HasValue, t => t.State == input.State.Value)
.OrderByDescending(t => t.CreationTime)
.ToListAsync();
return new ListResultDto<TaskListDto>(
ObjectMapper.Map<List<TaskListDto>>(tasks)
);
}
}
关键点说明:
- 继承自SimpleTaskAppAppServiceBase(最终继承自ABP的ApplicationService)
- 通过依赖注入获取Task仓储
- 使用WhereIf扩展方法实现条件查询
- 使用AutoMapper自动映射实体到DTO
总结
本文介绍了如何使用ASP.NET Boilerplate框架创建基于ASP.NET Core和EF Core的多层Web应用程序。我们完成了:
- 项目创建和基本配置
- 领域实体定义
- 数据库集成
- 应用服务层实现
在下一部分中,我们将继续开发Web界面,实现任务列表展示功能,并添加本地化支持。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考