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

时间:2012-04-26 19:35:38

标签: c# model-view-controller oop repository-pattern

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

示例:

class OrderRepository
{
    void CreateOrder(Order o)
    ...
}

class OrderService
{
    void CreateOrder(Order o)
    {
        //make some business logic tests
        ... 

        //call repository
        _orderRepository.CreateOrder(o);
    }
}

我看到两个问题:

  • 程序员可以直接调用存储库,因为它不知道服务的存在(有时它不像在这个例子中那么简单(1个服务= 1个具有相同方法名称的存储库)。一些应用程序不是记录得非常好。或者有人急着忘记检查是否存在相应的服务(错误)。)

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

2 个答案:

答案 0 :(得分:1)

Static analysis工具可以在这方面提供帮助。

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

答案 1 :(得分:1)

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

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