如果我用IoC容器注册一堆数据结构,我想说(C#语法):
var lookup = container.Create<IDictionary<Name,ISequence<EMail>>>() ;
容器应该神奇地找到实现IDictionary和ISequence的已注册类型,并构造我需要的类型。基本上,我想基于接口创建类型,并让容器确定哪些具体类型将满足我的要求。
[edit]我有一个界面层,它定义了许多类型和几个实现层。我想加载一个特定的实现,让容器自动地弄清楚可以用CExpr(或RubyExpr或PythonExpr)解析IExpr。如果它不明确,那么提出异常。
有没有具有Java或.NET IoC容器框架经验的人可以做到这一点吗?感谢。
答案 0 :(得分:1)
你试过看看Guice吗?它是一个Java DI框架,它使用注释而不是XML将接口绑定到实现。
答案 1 :(得分:1)
Spring是Java的标准IoC框架。默认情况下,您必须设置一个配置文件,该文件在执行时动态加载正确的类。通过一些操作,您可能会使用正确的解释器,但是您需要在表达式中包含一些元数据,或者为每种语言包含语言解析器,并使用每个表达式遍历解析器。 你想以什么方式解决这个问题?“凭空捏造”?
答案 2 :(得分:0)
我使用StructureMap,它可以做到....你可以在配置文件或代码中注册具体类型。
代码配置:
private static void LoadMap()
{
StructureMap.Pipeline.SmartInstance<ConcreteService> ServicePipeline = StructureMap.StructureMapConfiguration.ForRequestedType<IService>().TheDefault.Is.OfConcreteType<ConcreteService>();
IPServicePipeline.WithCtorArg("serviceIP").EqualTo("192.168.0.1");
StructureMap.StructureMapConfiguration.ForRequestedType<IDataRepository>().TheDefaultIsConcreteType<MySqlDataRepository>();
}
文件配置:
<StructureMap MementoStyle="Attribute">
<DefaultInstance PluginType="Blah.Core.Services.IService,Blah.Core" PluggedType="Blah.Services.ConcreteService,Blah.Services" ServiceIP="192.168.5.31"/>
<DefaultInstance PluginType="Blah.Core.Data.IDataRepository,Blah.Core" PluggedType="Blah.Data.MySql.MySqlDataRepository,Blah.Data"/>
通用配置:
<DefaultInstance PluginType="Blah.Core.Services.IService`1,Blah.Core" PluggedType="Blah.Services.EmailNotificationService`1,Blah.Services" smtpServerAddress="192.168.0.1" port="25"/>
获取通用类型:
IService<User> myUserService = ObjectFactory.GetInstance<IService<User>>();