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"));
}
}
答案 0 :(得分:0)
因此,如果您乐意为密钥使用字符串值,则此示例非常直接。
class FormattersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component
.For<IFormatter>()
.ImplementedBy<XmlFormatter>()
.Named(Format.Xml.ToString()));
container.Register(
Component
.For<IFormatter>()
.ImplementedBy<JsonFormatter>()
.Named(Format.Json.ToString()));
}
}
class Program
{
static void Main(string[] args)
{
var container = new WindsorContainer();
container.Install(new FormattersInstaller());
var xmlFormatter = container.Resolve<IFormatter>(Format.Xml.ToString());
var jsonFormatter = container.Resolve<IFormatter>(Format.Json.ToString());
// use the formatters...
}
}