0

私はtapestry5ユーザーで、拡張クラス内でのサービスの使用について質問しています。次のクラス構造があるとしましょう。

BaseClass

public class BaseClassImpl extends ExtendedOneClass implements BaseClass {

   @Inject
   private ServiceOne serviceOne;
}

ExtendedOneClass

public class ExtendedOneClass extends ExtendedTwoClass {

   @Inject
   private ServiceTwo serviceTwo;
}

ExtendedTwoClass

public class ExtendedTwoClas {

   @Inject
   private ServiceThree serviceThree;
}

拡張クラス内でサービスを使用できるようにするには、何をする必要がありますか?

AppModuleを次のように設定します

public static void bind(ServiceBinder binder) {
    binder.bind(BaseClass.class, BaseClassImpl.class);
    binder.bind(ExtendedOneClass.class);
    binder.bind(ExtendedTwoClass.class);
}

しかし、拡張クラス内でサービスを機能させることができないようです。これは、拡張クラスがタペストリーの@Injectでインスタンス化されていないためだと思います。では、問題はこのタスクをどのように達成するかということです。

4

1 に答える 1

0

コンストラクター インジェクションを使用して、サービスを親コンストラクターに渡します。

public class BaseClassImpl extends ExtendedOneClass implements BaseClass
{
   private HibernateSessionSource hibernateSessionSource;

   public BaseClassImpl(SystemEnvironment systemEnvironment, LinkSource linkSource, 
                        HibernateSessionSource hibernateSessionSource)
   {
       super(systemEnvironment, linkSource);
   }
}

とにかく、セットアップは機能しません。このセットアップにサービス ID を追加する必要があります。そうしないと、複数のサービスが同じインターフェースを実装することになります。これは役立つはずです:

binder.bind(ExtendedOneClass.class).withId("ext1");

これと組み合わせて:

@InjectService("ext1")
private ExtendedOneClass extendedOneClass;
于 2012-10-12T06:39:19.873 に答える