0

私はTapestry5ユーザーであり、いくつかの引数を使用してサービスクラスを@Injectする方法を考えています。私の理解では、@ Injectを使用してサービスクラスを注入することは、new MyClass();を使用してクラスをインスタンス化することと非常に似ています。私が抱えていると思われる問題は、引数をサービスに渡す方法がわからないことです。

タペストリーサービスの使用

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)が、それでも、タペストリーIoCがサービスをインスタンス化します。私のサービスのほとんどはタペストリーによって一度だけインスタンス化され、@Injectそれらを使用するとこのサービスへの参照が得られます。@Injectサービスを使用する場合は、最初にAppModuleを使用してサービスを定義する必要があります。IoCでサービスを利用可能にする最も簡単な方法は、AppModuleでそのようにバインドすることです。

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

次に、ページ/コンポーネントで次@Injectのようなインターフェイスを使用できます。

@Inject
private ServiceInterface service;

サービスでコンストラクター引数が必要な場合は、必要な引数を使用してServiceImplementation.classにコンストラクターを作成できます。それらの引数自体がバインドされたサービスである場合、タペストリーはこれを理解し、完了です。これらの引数が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 に答える