0

Guice を使用して特定のグラフを作成しないことを早い段階で決定した状況に陥っています。工場が必要ですが、それを構築する方法がわかりません。

私が達成したのは、セッション対応のゲーム オブジェクト管理システムです。

この作業に関与する必要があるすべてのオブジェクトは正常に機能します。

それらはすべて、インジェクション、プロバイダー、Guice ファクトリーなどによって作成されます。

このレベルで本当に管理できるようにする必要がある 1 つのオブジェクトは、Items です。

アイテムは、私が作成していない 1 つのオブジェクトでもあります。

また、アイテムには、クライアントが事前に知っている複雑なクラス階層がありますが、プラットフォーム コードにはありません。元の設計では、自分の工場を構築して、guicified コンポーネントを使用してこれらのオブジェクトを正しく構築できるようにしました。

これらのオブジェクトは管理レイヤーに参加する必要があるため、これは今までうまく機能していました。

現在の実装は次のとおりです。

abstract class Item{
  public Item(ItemID item){
    ...
  }
  ...
}

class MyItem extends Item{
   ...
}

class MyOtherItem extends MyItem{
   ...
}

class MyFavoriteItem extends Item{
   ...
}

私の現在の非Guiceの実装は、このように少し見えます

class ItemFactory{
   //this sequence generator is plugged into my persistance layer. Allows for generating
   //restful api calls for a specific item.
   @Inject
   private SequenceGenerator sequenceGenerator;

   public ItemID getNextItemID(){
     return sequenceGenerator.generateNextItemID();
   }

   //NOTE: these created objects do not participate in AOP
   //since they are not created by guice
   public <I extends Item> I createItem(Class<I> type){
     Item myItem = type.getConstructor(ItemID.class).newInstance(getNextItemID());
     return (I)myItem;
   }
}

サブタイプは私にはまったく不明であり、通常はクライアント モジュールによって提供されます。Guice で作成されたオブジェクトを使用して、開発中のゲーム フレームワークで管理された状態を提供できるという注釈がいくつかあります。

item を除くすべてのオブジェクトでうまく機能します...それらは Guice で作成されたオブジェクトではないためです。

私はむしろこのようなものを望みます:

class MyItem extends Item{
  @Inject
  public MyItem(@Assisted ItemID itemID);
}

interface MyGuiceFactory{
  public <I extends Item> I createItem(Class<I> type, ItemID itemID);
}

class MyGuiceModule extends AbstractModule{
  public void configure(){
    install(new FactoryModuleBuilder().build(MyGuiceFactory.class));
  }
}

class MyGuiceApp{
  @Inject
  private MyGuiceFactory factory;

  private SequenceGenerator sequenceGenerator

  @Inject
  public MyGuiceApp(SequenceGenerator generator){
    sequenceGenerator = generator;
  }

  public ItemID getNextItemID(){
    return sequenceGenerator.generateNextSequenceID(ItemID.class);
  }

  public <I extends Item> I createItem(Class<I> type){
    return (I)factory.createItem(type, getNextItemID());
  }
}

Guice は一般的な静的型をキーとして使用できないため、何を構築すればよいかわかりません。特定のものにバインドしたり、特定のものにバインドするように依頼したりすることはできないため

guice でビルドできずに困っています。ただし、これを Guice で作成する必要がある AOP コードがいくつかあります。

アプリケーションからサブタイプを作成できる場合、それらのサブタイプは、マネージド ゲーム ステート AOP レイヤーに参加できます。

どんなアドバイスも大いに役立ちます。

質問の言い換えに関するアドバイスも大歓迎です。

4

1 に答える 1

1

ご覧のとおり、ゲームは自家製の ioc-container そのものです。私が理解しているように、あなたが持っているどこかに

class AClass
{
  @Inject private Game game;
  void method() {
    Weapon weapon = game.createItem(AK47.class);
    weapon.shoot();
  }
}

Provider を使用するとは、次のことを意味します。

class AClass
{ 
  @Inject private Provider<AK47> ak47Provider;
  void method() {
    Weapon weapon = ak47Provider.get();
    weapon.shoot();
  }
}

アプリケーションに含めることができるすべてのプロバイダーをバインドするようにインジェクター モジュールを構成する必要がある場合。

Injectorゲームに を挿入してオブジェクト ファクトリとして使用すると、同じ効果が得られます。

class GameBase
{
  @Inject private Injector injector;
  public <I extends Item> I createItem(Class<I> itemType){
    return injector.getInstance(itemType);
  }
}

com.google.inject.Injector#getInstanceの署名があなたのものとまったく同じであることがわかりますcreateItemか?

しかし、私は最初のバリアントを好みます。よりクリーンに見え、依存関係が減ります。

于 2013-04-08T19:42:42.047 に答える