Spring.NET - 如何在运行时选择接口的实现?

时间:2010-03-25 11:00:41

标签: interface runtime spring.net

在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]

我该怎么办?

非常感谢!

2 个答案:

答案 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);

有几点需要注意:

  1. 传递您要使用的声明的 id 而不是类型名称,因此变量 declarationId 的值将为“ClassAInstance”或“ClassBInstance”。
  2. XmlApplicationContext(和WebApplicationContext)的构造函数接受一个字符串值数组的参数;变量 locations 将是一个配置资源数组,用于搜索以查找id为 declarationId 的对象。你不能在这里使用通用列表,它必须是一个实际的字符串数组。
  3. 上面第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);