我更好奇这是最佳做法还是应该避免。假设我有两个EJBS,每个都使用不同类型的对象,一个小部件和一个foo。管理小部件的EJB需要获得一组foos来进行一些处理。此功能已在FooManager bean中创建。
正在创建WidgetManager中的方法,而已经创建了FooManager方法。
这是我的意思的一个例子。这是一个简短的例子。
@Stateless
public class FooManager implements FooManagerLocal, FooManagerRemote
{
public List<Foo> getAllFoosForAWidget(widgetId)
{
//runs queries and builds foo list
}
public Boolean isWidgetCloseable(widgetId)
{
//a widget is closeable if all foos for that widget are set to "done"
List<Foo> foos = getallFoosForAWidget(widgetId);
boolean isCloseable = false;
//process foos and update isCloseable respectively
return new Boolean(boolean);
}
}
@Stateless
public class WidgetManager implements WidgetManagerLocal, WidgetManagerRemote
{
public void closeWidgetIfFoosAreDone(widgetId) //needs to do stuff with foos
{
//generate the widget based on widgetId
Widget widget = find(Widget.class, widgetId)
//is this appropriate?
//beans are gathered through our own beanclient
FooManager fooManager = BeanClient.getBean(FooManager.class);
if(fooManager.isWidgetCloseable(widgetId)
{
widget.setStatus(Close);
save(widget); //save widget back to database
}
}
}
我的问题是,WidgetManager bean应该调用FooManager bean中已经创建的方法吗?客户端是否应该检查哪些窗口小部件可以关闭,然后将ID列表发送到WidgetManager?
我倾向于后一种情况,因此EJB不必担心调用彼此的方法。客户端可以使用它们,只需要发送一个id列表。
答案 0 :(得分:3)
我会在WidgetManager中留下简单的'close'方法。通过这种方式,它与foo的关系会变得不那么紧张。
所以在其他一些Business Bean中,你将注入这两个bean并构建你的逻辑。
@Stateless
class SomeBusinessProcess implements ISomeBusinessProcess
{
@EJB FooManagerLocal fooManager;
@EJB WidgetManagerLocal widgetManager;
public void process(WidgetId id)
{
if (fooManager.isClosable(id))
widgetManager.close(id);
}
}
通过这种方式,您将获得更多自由,并且您的经理bean将更加清晰。
答案 1 :(得分:1)
上述模式称为服务外观,在此处进行了详细讨论:http://www.adam-bien.com/roller/abien/entry/why_service_isn_t_a