在使用存储库和服务模式的应用程序中,如何确保始终调用服务层而不是直接调用存储库?
示例:
class OrderRepository
{
void CreateOrder(Order o)
...
}
class OrderService
{
void CreateOrder(Order o)
{
//make some business logic tests
...
//call repository
_orderRepository.CreateOrder(o);
}
}
我看到两个问题:
程序员可以直接调用存储库,因为它不知道服务的存在(有时它不像在这个例子中那么简单(1个服务= 1个具有相同方法名称的存储库)。一些应用程序不是记录得非常好。或者有人急着忘记检查是否存在相应的服务(错误)。)
完全不同:很久以前有人创建了一些直接使用订单存储库的视图+控制器。那时没有必要进行一些业务逻辑检查或其他操作,只有订单存储库存在(因为根本不需要它)。如果稍后在创建订单时需要一些额外的操作,则将创建服务。问题是需要更改所有进行旧存储库调用的控制器。是不是存储库原则/想法(以及层中的代码分离)应该使部件彼此独立?
答案 0 :(得分:1)
Static analysis工具可以在这方面提供帮助。
nDepend是一个商业工具,可以集成到您的构建过程中并在这种情况下出错(任何非服务类直接调用存储库类)。
答案 1 :(得分:1)
您可以构建解决方案,以便所有存储库和服务都在各自的项目中,例如。 Repositories
和Services
。
唯一应引用Repositories
的项目是Services
。这样,其他项目将无法访问存储库。当然,没有什么可以阻止开发人员将存储库项目包含到控制器项目中,但希望在这一点上他们会问自己为什么它不包含在第一位。