Skip to content

项目结构

项目混合了 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();
    }
}