在Spring.NET IoC的所有示例中,我看到类似这样的内容:
interface IClass;
class ClassA : IClass;
class ClassB : IClass,
然后在config.xml文件中,例如:
[object id="IClass" type="ClassB, Spring.Net.Test" /]
但是我真的需要在配置文件中做这样的事情,如果接口有多个实现:
[object id="IClass" type="ClassA, Blah" /]
[object id="IClass" type="ClassB, Blah" /]
然后在_runtime_
我选择了他们。像这样:
IClass c = [get me all implementations of IClass, and choose the one with
GetType().FullName == myVariableContainingFullTypeNameOfObjectIWant]
我该怎么办?
非常感谢!
答案 0 :(得分:1)
之前我做过类似的事情,并采取了与法比亚诺所建议的方法非常相似的方法。
示例配置:
< object id =“ClassAInstance”type =“ClassA,Blah”> ...< / object>
< object id =“ClassBInstance”type =“ClassB,Blah”> ...< / object>
现在使用WebApplicationContext的一些通用示例代码:
IApplicationContext context = new XmlApplicationContext(locations);
IClass c = (IClass)context.GetObject(declarationId);
有几点需要注意:
上面第2点的一个有趣含义是,您实际上控制了ApplicationContext知道的配置资源:当您调用GetObject()方法时,ApplicationContext将仅在数组中给出的配置资源中搜索您的对象<强>位置[] 即可。这意味着,不是在一个文件中列出每个具有唯一ID的所有可能配置,而是可以使用多个配置资源,每个配置资源包含一个对象声明,每个配置资源具有相同的ID:
Config1.xml:&lt; object id =“IClassInstance”type =“ClassA,Blah”&gt; ...&lt; / object&gt;
Config2.xml:&lt; object id =“IClassInstance”type =“ClassA,Blah”&gt; ...&lt; / object&gt;
但是在实例化对象时,您可以控制创建的对象不是基于 declarationId ,在两种情况下都是“IClassInstance”,但是通过更改 locations [] < / strong>包含要使用的配置资源的数组,在本例中为Config1.xml或Config2.xml
希望这是有用的,
安德鲁
答案 1 :(得分:0)
也许你可以试试这个:
[object id =“Blah.ClassA”type =“ClassA,Blah”/]
[object id =“Blah.ClassB”type =“ClassB,Blah”/]
IClass =(IClass)ApplicationContext.GetObject(myVariableContainingFullTypeNameOfObjectIWant);