Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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
Java 任何可以基于接口构建类型的IoC容器?_Java_.net_Inversion Of Control - Fatal编程技术网

Java 任何可以基于接口构建类型的IoC容器?

Java 任何可以基于接口构建类型的IoC容器?,java,.net,inversion-of-control,Java,.net,Inversion Of Control,如果我在IoC容器中注册一组数据结构,我想说(C#语法): var lookup=container.Create(); 容器应该神奇地找到实现IDictionary和ISequence的注册类型,并构造我需要的类型。基本上,我希望基于接口创建类型,并让容器确定哪些具体类型将满足我的需求 [编辑]我有一个接口层,它定义了许多类型和几个实现层。我想加载一个特定的实现,让容器自动计算出IExpr可以用CExpr(或者RubyExpr或者PythonExpr)来解决。如果不明确,则引发异常 有Jav

如果我在IoC容器中注册一组数据结构,我想说(C#语法):

var lookup=container.Create();
容器应该神奇地找到实现IDictionary和ISequence的注册类型,并构造我需要的类型。基本上,我希望基于接口创建类型,并让容器确定哪些具体类型将满足我的需求

[编辑]我有一个接口层,它定义了许多类型和几个实现层。我想加载一个特定的实现,让容器自动计算出IExpr可以用CExpr(或者RubyExpr或者PythonExpr)来解决。如果不明确,则引发异常


有Java或.NETIOC容器框架经验的人见过这样的框架吗?谢谢。

我使用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>();
}
private static void LoadMap()
{
StructureMap.Pipeline.SmartInstance ServicePipeline=StructureMap.StructureMappConfiguration.ForRequestedType()。默认值为.OfConcreteType();
IPServicePipeline.WithTorArg(“serviceIP”).EqualTo(“192.168.0.1”);
StructureMap.StructureMappConfiguration.ForRequestedType().TheDefaultIsConcreteType();
}
文件配置:

<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>>();
IService myUserService=ObjectFactory.GetInstance();

你试过看Guice吗?它是一个JavaDI框架,使用注释而不是XML将接口绑定到实现。

Spring是Java的标准IoC框架。默认情况下,您必须设置一个配置文件,以便在执行时动态加载正确的类。只需稍加操作,就可以让它使用正确的解释器,但您需要在表达式中包含一些元数据,或者为每种语言包含一个语言解析器,并使用每种表达式遍历解析器。
您希望以何种方式解析表达式“凭空”?

我不明白-您是否希望容器(例如)凭空决定使用
SortedDictionary
作为
IDictionary
(而不是普通的
字典
),或者您想先告诉它使用
SortedDictionary
作为字典吗?如果是后者,所有常见的依赖项注入框架都是这样做的。@杰夫:我更喜欢前者(“凭空而来”),如果不明确,它会引发异常,如您的示例所示。但我可能可以破解后者(指定映射),使其实现我想要的功能。看起来不错。是的,您可以…只要您的CTOR中没有原语,或者有多个类实现要注册的接口,这就很好了。
IService<User> myUserService = ObjectFactory.GetInstance<IService<User>>();