Guice IoC 容器提供 MapBinder,这通常很有用。我们还在 .NET 中使用 Windsor v3.0。鉴于以下稍微做作的示例,任何人都可以建议如何以相同的方式使用温莎吗?
enum Format {
Xml,
Json
}
interface Formatter {
String format(Object o);
}
class XmlFormatter implements Formatter {
@Override
public String format(Object o) {
throw new NotImplementedException();
}
}
class JsonFormatter implements Formatter {
@Override
public String format(Object o) {
throw new NotImplementedException();
}
}
class FormattersModule extends AbstractModule {
@Override
protected void configure() {
MapBinder<Format, Formatter> formattersMapBinder
= MapBinder.newMapBinder(
binder(), Format.class, Formatter.class);
formattersMapBinder.addBinding(Format.Xml).to(XmlFormatter.class);
formattersMapBinder.addBinding(Format.Json).to(JsonFormatter.class);
}
}
class FormattersClient {
private final Map<Format, Formatter> formatters;
@Inject
FormattersClient(Map<Format, Formatter> formatters) {
this.formatters = formatters;
}
public void Format(Format format, Object o) {
String s = formatters.get(format).format(o);
// ... do something with s ...
}
}
public class Main {
private static Injector injector;
public static void main(String[] args) {
injector = Guice.createInjector(new FormattersModule());
FormattersClient formattersClient
= injector.getInstance(FormattersClient.class);
formattersClient.Format(Format.Json, new String("Foo"));
formattersClient.Format(Format.Xml, new String("Foo"));
}
}