会话外观和数据传输对象

时间:2014-01-23 23:39:45

标签: java-ee ejb dto stateless-session-bean facade

实体Bean的多个细粒度调用会增加网络调用的开销,甚至是多个事务。换句话说,风险是具有高网络开销,高耦合,可重用性和可维护性差的解决方案。我们使用会话Facade来封装业务层组件,并向远程客户端公开粗粒度服务。
我们使用数据传输对象减少呼叫次数,这意味着您需要在每次呼叫时传输更多数据。 我想知道是什么让这两种模式如此不同。一个是DTO中的序列化,但其他人呢?

1 个答案:

答案 0 :(得分:1)

虽然它们很好地协同工作,但这些模式完全不同。

您对会话外观的描述已经足够了:

  

我们使用会话Facade来封装业务层组件,并向远程客户端公开粗粒度服务。

然而,关于DTO的那个并没有反映出模式的动机,它可能是你怀疑的根源。

DTO模式非常简单。如果您已经暴露了粗粒度服务(遵循会话外观模式中的想法),它可能需要几个输入参数,并且它可能会产生相对复杂的输出。为了处理此客户端服务数据传输,您可以创建一个序列化对象(在本例中称为DTO),它表示服务所需的参数。同样的想法适用于服务输出,所有这些信息都将封装在一个简单的java对象中。

//class that represents the service
public MyCoarseGrainedServiceClass{
public MyServiceOutDTO myCoarseGrainedService(MyServiceInDTO params) {
    MyServiceOutDTO outout;
            //your code goes here
    return output;
}
}

public MyServiceInDTO {
    //a list o different parameters of any type
    private int firstParam;
    private String secondParam;
    .
    .
    .
    //getters and setters
}

public MyServiceOutDTO {
    //this object represents the service output
    private int fistrOutputValue;
    ...
    //getters ans setters
}

请注意,您可以使用不使用任何DTO的粗粒度服务,但DTO对象本身不会实现粗粒度服务。