从另一个服务类中调用服务方法

3
我有两个服务类。WarehouseManagementService提供管理仓库和库存的方法。SalesManagementService提供管理客户及其订单的方法。
要创建订单,需要检查订单项数量是否充足。为此,我将使用WarehouseManagementService中的availableStock(Product p)方法。但我不知道如何正确调用此方法。
我应该在SalesManagementService中创建WarehouseManagementService的实例吗?还是应该将WarehouseManagementServiceInterface添加到SalesManagementService构造函数(依赖注入)中?
为了实现这两个类的松耦合,一个好的架构应该是什么样的?
谢谢。
public class WarehouseManagementService implements WarehouseManagementServiceInterface {

    private DatabaseReadWarehouseInterface dbRead;
    private DatabaseWriteWarehouseInterface dbWrite;

    public int availableStock(Product p) {
    // returns available quantity of product
    }

}

public class SalesManagementService implements SalesManagementServiceInterface {

    private DatabaseReadSalesInterface dbRead;
    private DatabaseWriteSalesInterface dbWrite;

    public void addOrder(Order o) {
    // creates order, if product quantity is sufficient
    }

}

你是否在使用Spring框架? - Mustahsan
不,我没有使用Spring框架。由于这是一个小型的研究项目,它并不打算被使用。 - user9870801
好的,那么您需要在彼此之间创建服务对象。 - Mustahsan
1
@Mustahsan:我不同意。即使没有使用Spring,你也应该解耦依赖关系。 - fjc
构造函数依赖是创建类对象的最佳选择。 - MangduYogii
1个回答

5

您的感觉是正确的:依赖项应该被注入。只需记住单一职责原则:“一个类只应该有一个改变的理由”。

通过在SalesManagementService中构建WarehouseManagementService,您将为SalesManagementService添加第二个更改原因:当构建WarehouseManagementService的方式发生变化时。

要解决这个问题,您可以使用一个全功能的依赖注入框架,或者简单地开始通过向SalesManagementService添加构造函数参数来解决问题:

public class SalesManagementService implements SalesManagementServiceInterface {

    private DatabaseReadSalesInterface dbRead;
    private DatabaseWriteSalesInterface dbWrite;
    private WarehouseManagementServiceInterface warehouseManagementService;

    constructor(DatabaseReadSalesInterface dbRead,
                DatabaseWriteSalesInterface dbWrite,
                WarehouseManagementServiceInterface warehouseManagementService) {
        this.dbRead = dbRead;
        this.dbWrite = dbWrite;
        this.warehouseManagementService = warehouseManagementService;
    }

    public void addOrder(Order o) {
    // creates order, if product quantity is sufficient
    }

}

然后在你的main方法中,要注意实例化WarehouseManagementService并将其传递给SalesManagementService

顺便说一句,你可能想将SalesManagementServiceWarehouseManagementService的构建移动到工厂中,以便获得SalesManagementServiceInterfaceWarehouseManagementServiceInterface而不是具体的类(“面向接口编程,而不是实现”)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接