在使用IoC容器编写代码时(而不是通过xml进行配置),你通常需要明确指定所有程序集的项目/构建引用吗?
为什么要分离程序集呢?因为:
"把抽象类和它们的具体实现放在不同的程序集中是实现这种分离的好方法。" -Framework Design Guidelines p.91
例如:
假设我有PersonBase.dll和Bob.dll
Bob继承自抽象类PersonBase。它们都在Person命名空间中,但在不同的程序集中。
我编写的代码是面向PersonBase的,而不是面向Bob的。
回到我的主要代码,我需要一个人。 StructureMap可以扫描程序集。太好了,我会要求StructureMap提供一个人!
现在,在我的主要代码中,当然只涉及PersonBase,而不是Bob。我实际上不希望我的代码了解Bob的任何信息。没有项目引用,什么也没有。这就是整个问题的重点。
所以我想说:
//Reference: PersonBase.dll (only)
using Person;
...
//this is as much as we'll ever be specific about Bob:
Scan( x=> { x.Assembly("Bob.dll"); }
//Ok, I should now have something that's a PersonBase (Bob). But no ?
ObjectFactory.GetAllInstances<PersonBase>().Count == 0
没什么运气。起作用的是明确表达我想要Bob:
//Reference: PersonBase.dll and Bob.dll
using Person;
...
Scan( x => {x.Assembly("Bob.dll"); }
//If I'm explicit, it works. But Bob's just a PersonBase, what gives?
ObjectFactory.GetAllInstances<Bob>().Count == 1 //there he is!
但现在我不得不在我的项目中引用 Bob.dll,这正是我所不想要的。
我可以使用Spring + Xml配置来避免这种情况。但是接着我又回到了Spring + Xml配置...!
我是否在使用StructureMap时遗漏了什么,或者说,作为一般原则,(流畅的)IoC配置需要显式引用所有程序集?
可能相关的问题: StructureMap和扫描程序集