Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Windsor模拟Guice的MapBinder?_C#_Java_Castle Windsor_Guice - Fatal编程技术网

C# 如何使用Windsor模拟Guice的MapBinder?

C# 如何使用Windsor模拟Guice的MapBinder?,c#,java,castle-windsor,guice,C#,Java,Castle Windsor,Guice,Guice IoC容器提供MapBinder,这通常很有用。 我们还在.NET中使用Windsor v3.0。 考虑到下面这个稍微做作的例子,有人能建议如何以同样的方式使用温莎吗 enum Format { Xml, Json } interface Formatter { String format(Object o); } class XmlFormatter implements Formatter { @Override public String

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

如果您愿意使用字符串值作为键,那么这个示例非常简单

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...
    }
}