2010-06-08 34 views
3

最近我一直在研究依赖注入和控制反转实践,以努力改进我们的应用程序框架的体系结构,我似乎无法找到一个好的答案题。这很可能是我的术语混淆,混淆,或者我现在对这个概念只是天真的,所以任何链接或澄清,将不胜感激。序列化依赖注入配置/控制反转

许多DI和IoC容器的例子并没有说明当你有一个可能的“插件”“库”,或者如何“序列化”一个给定的配置时,容器将如何连接在一起。 (从我读过的关于MEF的文章可以看出,如果你的对象只需要1 [Import],那么对于同一类型的[Export]多个声明将不起作用)。也许这是一种不同的模式,或者我被我目前的思维方式蒙上了一层阴影。

下面是一个例子参考一些代码:IoC.Resolve vs Constructor Injection

关于“细粒度背景”,其中同一对象的两个实例所需要的“引擎”类的不同实现
public abstract class Engine { 
} 

public class FastEngine : Engine { 
} 

public class MediumEngine : Engine { 
} 

public class SlowEngine : Engine { 
} 

public class Car 
{ 
    public Car(Engine e) 
    { 
     engine = e; 
    } 

    private Engine engine; 
} 

这篇文章会谈

有没有一个好的框架可以帮助你配置或序列化一个配置来实现类似这样的事情,而不需要对它进行硬编码或手动滚动代码来做到这一点?

public class Application 
{ 
    public void Go() 
    { 
     Car c1 = new Car(new FastEngine()); 
     Car c2 = new Car(new SlowEngine()); 
    } 
} 

示例XML:

<XML> 
    <Cars> 
     <Car name="c1" engine="FastEngine" /> 
     <Car name="c2" engine="SlowEngine" /> 
    </Cars> 
</XML> 
+0

谢谢那些提供答案的人。 虽然其他答案给出了具体框架的例子,但可以接受的答案指出,许多DI框架可以通过XML配置(Unity,Spring等)完成此功能。您可以根据平台和偏好确定使用哪一个。 – 2010-06-09 14:37:11

回答

0

大多数DI容器支持XML配置 - 事实上,他们大多数是以这种方式开始的,XML配置是只有选项。时下,XML configuration is one option among several

但是,在它当前的版本中,MEF不使用XML配置。它也不是一个DI容器。

+0

感谢您的链接。现在我已经阅读了关于MEF的更多内容,但我不认为未知的运行时发现是我正在寻找的。 它看起来像XML配置和代码配置之间的公开辩论。最终,我想建立一个工具包,可供非程序员使用,以便在给定丰富的程序员构建库的情况下“将所有东西连接在一起”。这听起来像XML配置在这里更合适。 – 2010-06-09 12:19:55

0

使用MEF(你提到的),你可以使用[ImportMany]导入引擎实例的集合。然后,您可以为每个引擎创建一个汽车,并返回该汽车,而不需要XML。

public class Application 
{ 
    [ImportMany] 
    public IEnumerable<Engine> Engines { get; set; } 

    public void Go() 
    { 
     // I'm assuming this object was composed already... 

     var cars = this.Engines.Select(e => new Car(e)); 

     foreach(var car in cars) 
     { 
      // Do something with each car 
     } 
    } 
} 

这样做的好处是可以随时添加新的“引擎”,而无需更改代码。所有接线均在运行时动态处理,无需配置。

+0

谢谢里德。我确实在MEF中找到了[ImportMany]属性,这对于动态加载事物集合似乎很好。我认为我试图解决的问题是允许某人明确哪些对象被用于每辆车。我可以看到使用这种方法在运行时如何将新的Engine对象添加到列表中,但我需要一些序列化“Car 1使用快速引擎”这一事实的方法,因此,当我创建Car 1时,请给它一个快速引擎。 – 2010-06-09 00:52:52

1

我不知道MEF,但春天确实你描述使用几乎一模一样的方法你描述(注射用XML文件或配置部分配置)正是:

<objects> 
    <object name="FastCar" type="MyApp.Car"> 
    <constructor-arg> 
     <ref object="FastEngine"> 
    </constructor-arg> 
    </object> 
    <object name="SlowCar" type="MyApp.Car"> 
    <constructor-arg> 
     <ref object="SlowEngine"> 
    </constructor-arg>  
    </object> 
    <object name="FastEngine" type="MyApp.FastEngine"/> 
    <object name="SlowEngine" type="MyApp.SlowEngine"/> 
</objects> 
+0

很酷,我见过春天提到过,但我没有追求任何进一步的阅读。我会检查出来的。谢谢! – 2010-06-09 00:55:20