Eclipse RCP应用程序示例
现在我们具有了构建应用程序的所有元素。我们的例子可用于显示用户感兴趣的名言警句。它由四个插件组成:
- Service Locator插件,提供IoC框架
- FortuneService插件,提供服务管理fortune cookie
- FortuneInterface插件,发布访问服务所需的公共接口
- FortuneClient插件,提供Eclipse应用程序,以Eclipse视图中显示名言警句。
采用IoC设计,使服务的实现与客户分离;服务实例可以修改,对客户没有影响。图2显示了插件间的依赖关系。
 图2. 插件间的依赖关系:
ServiceLocator和接口定义使服务和客户分离。
如前面所述,Service
Locator将客户和服务绑定到一起。FortuneInterface只定义了公共接口 IFortuneCookie,客户可以用它访问cookie消息:
public interface IFortuneCookie {
public String getMessage();
} FortuneService提供了一个简单的服务工厂,用于创建IFortuneCookie的实现:
public class FortuneServiceFactory implements IServiceFactory {
public Object getServiceInstance() throws ServiceException {
return new FortuneCookieImpl();
}
// ... omissis ...
} 工厂注册到service locator插件的扩展点,在plugin.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
<extension
point="com.onjava.servicelocator.servicefactory">
<serviceFactory
class="com.onjava.fortuneservice.FortuneServiceFactory"
id="com.onjava.fortuneservice.FortuneServiceFactory"
name="Fortune Service Factory"
resourceClass="com.onjava.fortuneservice.IFortuneCookie"/>
</extension>
</plugin> resourceClass属性定义了该工厂所提供的服务的类。在FortuneClient插件中,
Eclipse视图使用该服务:
@Serviceable
public class View extends ViewPart {
public static final String ID = "FortuneClient.view";
private IFortuneCookie cookie;
@Injected(optional = false)
public void setDate(IFortuneCookie cookie) {
this.cookie = cookie;
}
public void createPartControl(Composite parent) {
Label l = new Label(parent, SWT.WRAP);
l.setText("Your fortune cookie is:\n" + cookie.getMessage());
}
public void setFocus() {
}
} 注意这里出现了Serviceable和Injected注释,用于定义依赖的外部服务,并且没有引用任何服务代码。最终结果是,createPartControl()
可以自由地使用cookie对象,可以确保它被正确地初始化。示例程序如图3所示
 图3. 示例程序
结论
本文我讨论了如何结合使用一个强大的编程模式--它简化了代码依赖的处理(反转控制),与Java客户端程序(Eclipse
RCP)。即使我没有处理影响这个问题的更多细节,我已经演示了一个简单的应用程序的服务和客户是如何解耦的。我还描述了当开发客户和服务时,
Eclipse插件技术是如何实现关注分离的。然而,还有许多有趣的因素仍然需要去探究,例如,当服务不再需要时的清理策略,或使用mock-up服务对客户端插件进行单元测试,这些问题我将留给读者去思考。
|