Re: IoC, DI, and a mess...
Piotr Kobzda wrote:
Daniel Pitts wrote:
Now, the real trick is... The Computer has an InterruptTable,
PortTable, and InstructionTable instance, each of which have basically
a Map<Integer, Interrupt>, Map<Integer, Port>, etc... Is there a way
with Guice to set up that mapping? There is quite a bit of complex
wiring in that part of it too.
I think you can achieve this with a binding to a custom provider of each
map type (possibly additionally annotatedWith() in a case of mapping of
the same map types). Now you'll need a Module implementation for at
least a maps mappings, for example:
binder.bind(new TypeLiteral<Map<Integer, Port>>() {})
.toProvider(new Provider<Map<Integer,Port>>() {
@Inject final Provider<Port> portProvider = null;
public Map<Integer, Port> get() {
Map<Integer, Port> map = new HashMap<Integer, Port>();
// initialize a map... e.g.
for(int i = 0; i < 10; ++i) {
map.put(i, portProvider.get());
}
return map;
}
});
// and similar for other maps...
piotr
Thanks, Unfortunately, each port/interrupt/instruction has a different
runtime type. eg. there are 47 concrete Instruction implementations,
something like 18 Interrupts, etc... So I currently have code that does:
instruction.put(1, new AddInstruction());
instruction.put(2, new SubtractInstruction());
....
instruction.put(47, new JumpInstruction());
I was thinking of externalizing the mapping to a file (properties or
xml), but I was holding off on that exercise until I needed different
arrangements of instructions.
I suppose I could externalize to a properties file, and then use the
binder you have shown, but that seems a bit messy to me.
--
Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>