C# 如何使用Windsor模拟Guice的MapBinder?
Guice IoC容器提供MapBinder,这通常很有用。 我们还在.NET中使用Windsor v3.0。 考虑到下面这个稍微做作的例子,有人能建议如何以同样的方式使用温莎吗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
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...
}
}