0

我是 Tapestry5 用户,想知道如何使用一些参数 @Inject 服务类。据我了解,使用@Inject 注入服务类与使用 new MyClass(); 实例化一个类非常相似。我似乎遇到的问题是我不确定如何将参数传递到服务中。

例子

使用 Tapestry 服务

public class Main {

    @Inject
    private MyService myService;

    public Main() {
        //Where would I pass in my arguements?
        this.myService();

       //I can't seem to do this by passing the arg's in through 
       //this.myService(arg1, arg2) unless I may be missing something. 
    }

}

传统用法

public class Main {

    public Main() {
        //In this example I can pass my arg's into the constructor. 
        MyService myService = new MyService(arg1, arg2);
    }

}
4

1 回答 1

2

假设 @Inject 类似于实例化,您并不完全正确。当您的服务被注释时,您可能会对此有些争论,@Scope(ScopeConstants.PERTHREAD)但即便如此,tapestry IoC也会为您实例化服务。我发现我的大部分服务只通过 Tapestry 实例化一次,并且@Inject'ing 它们为我提供了对该服务的引用。如果你想@Inject 一个服务,你首先需要用你的AppModule定义它。通过 IoC 使您的服务可用的最简单方法是在您的 AppModule 中像这样绑定它:

public static void bind(ServiceBinder binder) {
    binder.bind(ServiceInterface.class, ServiceImplementation.class)
}

然后在您的页面/组件中,您可以@Inject使用如下界面:

@Inject
private ServiceInterface service;

如果您的服务需要构造函数参数,您可以在 ServiceImplementation.class 中创建一个构造函数,并获取所需的参数。如果这些参数本身就是绑定服务,tapestry 会解决这个问题,你就完成了。如果这些参数不是 Tapetsry 已知的服务,并且无论出于何种原因您都无法绑定它们,您可以在 AppModule 中创建一个构建方法:

/**
 * These methods may in them selves take bound services as arguments helping you build your new service
 */
public ServiceInterface buildServiceInterface(AnotherBoundService service2) {
    ...
    return new ServiceImplementation(service2, someMoreArgsIfRequired)
}

如果您不想使用 IoC,您总是可以在您的页面/组件中实例化服务,因为它们只是简单的 pojo。请查看IoC 文档。它很好地概述了您可以使用的所有强大功能。

于 2012-08-19T09:44:41.277 回答