0

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"));
    }
}
4

1 回答 1

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...
    }
}
于 2012-06-25T14:08:13.337 回答