存储库/服务模式和数据一致性

本文关键字:数据一致性 模式 服务 存储 | 更新日期: 2023-09-27 18:32:26

在使用存储库和服务模式的应用程序中,如何确保始终调用服务层而不是直接调用存储库?

例:

class OrderRepository
{
    void CreateOrder(Order o)
    ...
}
class OrderService
{
    void CreateOrder(Order o)
    {
        //make some business logic tests
        ... 
        //call repository
        _orderRepository.CreateOrder(o);
    }
}

我看到两个问题:

  • 程序员可能会直接调用存储库,因为它不知道服务的存在(有时它不像这个例子那么简单(1 个服务 = 1 个具有相同方法名称的存储库)。 有些应用程序没有很好的文档记录。 或者匆忙的人可能会忘记检查相应的服务是否存在(错误))。

  • 完全不同的:很久以前有人创建了一些直接使用订单存储库的视图+控制器。当时不需要一些业务逻辑检查或额外的操作,只存在订单存储库(因为根本不需要它)。如果以后在创建订单时需要一些其他操作,则将创建服务。问题是所有进行旧存储库调用的控制器都需要更改。存储库原则/想法(以及分层分离代码)不应该使部分彼此独立吗?

存储库/服务模式和数据一致性

您可以构建解决方案,以便所有存储库和服务都位于其各自的项目中,例如。 RepositoriesServices .

唯一应该引用Repositories的项目是 Services 。这样,其他项目将无法访问存储库。当然,没有什么可以阻止开发人员将存储库项目包含在控制器项目中,但希望在这一点上他们会问自己为什么一开始就没有包含它。

静态分析工具可以在这方面提供帮助。

nDepend是一个商业工具,可以集成到您的构建过程中,并在这种情况下出错(任何直接调用存储库类的非服务类)。