38

服务层架构

简介

本文档旨在分析服务层的设计与实现,重点讲解各类服务(如 AdminServicePlatformService 等)的功能分工及其与数据层、前端的关系。此外,还将介绍如何自定义服务和扩展现有服务。

项目结构

项目结构按功能模块划分,主要分为以下几部分:

  1. 核心服务层:位于 Known/Services/ 目录下,包含 AdminServicePlatformServiceEntityServiceCodeService 等核心服务。
  2. 基础类库ServiceBase.cs 提供了服务的基础功能,如数据查询、保存和删除。
  3. 插件模块:如 Known.AdminKnown.Cells,用于扩展功能。

核心组件

1. ServiceBase

  • 功能:提供通用的服务方法,如数据查询、保存和删除。
  • 关键方法
    1. QueryModelsAsync:异步查询数据。
    2. DeleteModelsAsync:异步删除数据。
    3. SaveModelAsync:异步保存数据。

2. AdminService

  • 功能:管理后台数据服务。
  • 特点
    • 实现了 IAdminService 接口。
    • 使用 Context 对象传递上下文信息。

3. PlatformService

  • 功能:框架平台数据服务。
  • 关键方法
    • SetRenderModeAsync:设置呈现模式。

4. EntityService

  • 功能:泛型实体服务,支持分页查询、获取、删除和保存实体。
  • 特点
    • 支持泛型类型 TEntity
    • 提供了客户端和服务端实现。

5. CodeService

  • 功能:代码生成服务。
  • 关键方法
    • GetDbTablesAsync:获取数据库表列表。
    • SaveCodeAsync:保存生成的代码。

架构概述

服务层采用分层架构,核心服务通过 ServiceBase 提供基础功能,其他服务通过继承或实现接口扩展功能。客户端和服务端通过 HttpClient 通信。

classDiagram
  class ServiceBase {
    +QueryModelsAsync()
    +DeleteModelsAsync()
    +SaveModelAsync()
  }
  class AdminService {
    +IAdminService
  }
  class PlatformService {
    +SetRenderModeAsync()
  }
  class EntityService {
    +QueryAsync()
    +SaveAsync()
  }
  class CodeService {
    +GetDbTablesAsync()
    +SaveCodeAsync()
  }
  ServiceBase <|-- AdminService
  ServiceBase <|-- PlatformService
  ServiceBase <|-- EntityService
  ServiceBase <|-- CodeService

详细组件分析

1. ServiceBase

  • 代码片段
    protected static Task<PagingResult<T>> QueryModelsAsync<T>(string key, PagingCriteria criteria, Func<List<T>, List<T>> filter = null)
    {
        var result = AppData.QueryModels(key, criteria, filter);
        return Task.FromResult(result);
    }
    
  • 说明:该方法用于异步查询数据,支持分页和过滤。

2. PlatformService

  • 代码片段
    public Task SetRenderModeAsync(string mode)
    {
        Config.RenderMode = Utils.ConvertTo<RenderType>(mode);
        return Task.CompletedTask;
    }
    
  • 说明:设置呈现模式,将字符串转换为枚举类型。

依赖关系分析

  1. ServiceBase 是所有服务的基类,提供通用功能。
  2. AdminServicePlatformService 直接依赖 ServiceBase
  3. EntityServiceCodeService 通过泛型和接口扩展功能。

性能考量

  • 查询性能QueryModelsAsync 方法通过 AppData 直接操作数据,性能依赖于底层数据源。
  • 异步操作:所有方法均为异步,适合高并发场景。

常见问题解答

1. 如何扩展服务?

通过继承 ServiceBase 或实现接口(如 IAdminService)扩展功能。

2. 如何自定义数据查询?

QueryModelsAsync 方法中传入自定义的 filter 函数。

结论

服务层设计清晰,功能分工明确,易于扩展和维护。通过 ServiceBase 提供的基础功能,开发者可以快速实现自定义服务。