项目结构
项目混合了 MVC 与经典的三层架构,包含数据访问层(DAL)、业务逻辑层(Service)、控制器层(Controller)。各层分别包含接口类与实现类。前端项目单独实现,在此不做讨论。
分层介绍
层级 | 描述 |
---|---|
DAL | 数据访问层,负责与数据库交互。用于实现复杂的数据库操作。 |
Service | 业务逻辑层,处理业务规则和逻辑。 |
Controller | 控制器层,处理用户输入并调用相应的服务。 |
DAL
由于项目使用了 ORM 技术,大部分数据操作可利用内置的方法实现,DAL 层的代码很少。继承基础类指定实体类型即可。
示例如下:
csharp
public interface IRoleDal : IBaseDal<Role>
{
}
csharp
[Repository]
public class RoleDal : BaseDal<Role>, IRoleDal
{
}
当然,如果数据操作较为复杂,比如多表关联场景,则仍然需要在 DAL 层添加方法实现。 此时可以通过 DB
属性获取数据库上下文,调用 ORM 原生方法进行任意操作。
Service
服务层是整个项目的核心层,用来实现业务逻辑。为方便数据操作,服务层提供了基础服务类 BaseService
,继承后即可调用各种辅助方法。详细方法列表请参考 服务 API。
简单示例如下:
csharp
public interface IRoleService : IBaseService<Role>
{
string GetRoleName(string id);
}
csharp
[Service(typeof(IRoleService))]
public class RoleService : BaseService<Role>, IRoleService
{
public string GetRoleName(string id)
{
return Select(t => t.Id == id, t => t.Name);
}
}
同时,服务层也提供了一些常用对象。具体如下:
- baseDal :数据访问层实例,用于调用数据操作方法。
- snowflake :雪花算法实例,用于生成唯一 ID。
- currentUser :当前登录用户实例,用于获取当前登录用户信息。
提示
特别地,在操作异构数据源时,其主键 id 、操作人、操作时间等字段可能与内置的不一致。此时可以继承更底层的基础类 BaseGenericService
,使用消减部分功能后的基础方法。
注意
框架并不禁止服务类之间相互引用,但需要注意因循环引用引起的性能问题,尤其在存在大量服务依赖时。
Controller
控制器层负责处理用户输入并调用相应的服务。框架提供了 ToResult
方法,可以方便地将返回内容转换为 Result
对象。
示例如下:
csharp
[ApiController]
[Route("/api/roles")]
public class RoleController
{
[Autowired]
private IRoleService service;
[HttpGet("{id}")]
Result GetRole(string id)
{
return service.GetRoleName(id).ToResult();
}
}