Hivemind 的数据层设计问题

问题描述 投票:0回答:1

我正在重构我的数据层,以拥有一个清晰的存储库和服务,以便开始构建单元测试。这是我从工作中的前任开发人员那里继承的应用程序。

目前,他们使用简洁的查询为数据库中的每个对象(表)提供一个数据服务类。

  • 用户数据
  • 汽车数据
  • RI状态代码数据
  • 等等

我的问题是关于只有一两个选择查询的静态表。

我应该保持分离还是创建单个服务来在需要时查询所有静态表信息?我有 15 - 20 个 Ri_Data 服务,它们所做的就是使用单一方法调用下拉菜单数据。

为每一个提供自定义服务和存储库似乎有点多余,但我可能想得太多了。

我正在讨论将这些合并到一个 RIDataService 中,但想先获得一些替代意见。同时将我独特的物品分开

c# .net dapper code-standards
1个回答
0
投票

重构数据层并决定如何为仅涉及简单查询的静态表构建服务是使用遗留代码库时的常见挑战。该决定很大程度上取决于保持代码清晰度、可扩展性以及简化未来的单元测试。以下是一些关于如何解决此问题的想法和选项:

  1. 静态表整合服务(一服务多表) 如果您有 15-20 个服务,这些服务大多只是进行简单的选择查询来检索静态数据(例如下拉值或静态引用),那么将这些服务合并到单个服务中可以显着减少冗余。这将允许您将类似的操作分组在一起并使代码库更易于维护。

优点:

减少代码重复 更容易维护 意图更清晰

示例: 公共类静态数据服务 { 私有只读 IDbConnection _dbConnection;

public StaticDataService(IDbConnection dbConnection)
{
    _dbConnection = dbConnection;
}

public IEnumerable<DropdownItem> GetRIStateCodes() =>
    _dbConnection.Query<DropdownItem>("SELECT StateCode, StateName FROM RIStateCodeData");

public IEnumerable<DropdownItem> GetCarTypes() =>
    _dbConnection.Query<DropdownItem>("SELECT CarTypeId, CarTypeName FROM CarData");

// Add more methods for other static data queries

}

  1. 如果有意义的话,保持每张桌子的分隔 或者,如果每个静态表都有独特的业务逻辑,或者将来可能会通过其他方法进行增长,则可以为每个表保留单独的服务。这将保持清晰的关注点分离,使每个服务专注于特定的数据实体。

优点: 可扩展性 关注点分离 清晰的业务逻辑封装

示例: 公共类 RIStateCodeService { 私有只读 IDbConnection _dbConnection;

public RIStateCodeService(IDbConnection dbConnection)
{
    _dbConnection = dbConnection;
}

public IEnumerable<DropdownItem> GetStateCodes() =>
    _dbConnection.Query<DropdownItem>("SELECT StateCode, StateName FROM RIStateCodeData");

}

公共类CarDataService { 私有只读 IDbConnection _dbConnection;

public CarDataService(IDbConnection dbConnection)
{
    _dbConnection = dbConnection;
}

public IEnumerable<DropdownItem> GetCarTypes() =>
    _dbConnection.Query<DropdownItem>("SELECT CarTypeId, CarTypeName FROM CarData");

}

  1. 使用混合方法:

示例: 将 RIStateCodeData、CarData、CountryData 等服务合并到单个 StaticDataService 中,因为它们的查询简单且相似。 为具有或将具有更复杂查询或业务逻辑的表保留单独的服务(例如 UserDataService 或 OrderDataService)。

  1. 单元测试: 单一服务方法:您仍然可以通过模拟数据库连接并验证方法是否返回预期数据来对组合的 StaticDataService 进行单元测试。这实际上可以简化单元测试,因为您只需要模拟单个服务。

单独的服务方法:如果每个静态服务保持独立,单元测试将更加精细,但可能会在测试中引入一些重复,特别是对于所有这些服务中存在的公共查询逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.