Я застрял в ситуации, когда заранее решил не создавать конкретный график с помощью Guice. Мне нужен завод, но я не могу понять, как его построить.
Чего я добился, так это системы управления игровыми объектами с учетом сеанса.
Все объекты, которые должны быть задействованы в этом, работают нормально.
Все они создаются с помощью инъекций, провайдеров, фабрик guice и т. д.
Единственный объект, которым мне действительно нужно управлять на этом уровне, — это Предметы.
Предметы также являются единственным объектом, который я не могу создать.
Элементы также имеют сложную иерархию классов, о которой клиент знает заранее, а код платформы — нет. В моем первоначальном проекте я построил свою собственную фабрику, чтобы иметь возможность использовать мои компоненты для правильного создания этих объектов.
До сих пор это работало нормально, поскольку эти объекты должны участвовать в уровне управления, мне нужно найти хитрое решение.
Вот текущая реализация:
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, я могу обеспечить управляемое состояние в игровой среде, которую я разрабатываю.
Он отлично работает для всех объектов, кроме элемента... поскольку они не являются объектами, созданными вручную.
Я бы предпочел что-то вроде этого:
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.
Любой совет будет большим подспорьем.
Любые советы по перефразировке вопроса также будут очень признательны.
ItemFactory
имеет два метода. Как взаимодействуютItemID
иcreateItem
? - person kan   schedule 08.04.2013Provider<MyItem> myItemProvider
илиProvider<MyOtherItem> myOtherItemProver
впрыски вместо заводских. - person kan   schedule 08.04.2013.class
на фабрику, например. у вас может быть карта фабрик или квалифицированные фабрики для каждого типа. Не могли бы вы дать более подробную информацию, чего вы пытаетесь достичь? - person kan   schedule 08.04.2013<I extends Item> I createItem(Class<I> itemType)
эквивалентноProvider<ConcreteItem> provider
, а затемprovider.get()
. Не могли бы вы показать пример того, как вы используете createItem? Как предоставляетсяClass
? - person kan   schedule 08.04.2013GameManager manager = GameModule.getGameManager()
Game game = gameManager.createGame();
Оружие расширяет элементWeapon weapon = game.createItem(AK47.class //extends Weapon)
все, что мне нужно, это результирующий объектgame.createItem(Class<I> itemType)
, который будет создан с помощью guice. Я не могу найти явный способ сделать это. Итак, чтобы ответить на ваш вопрос, это клиентский код, который предоставляет тип элемента - person AnthonyJClink   schedule 08.04.2013