Хотя этот вопрос связан с StructureMap, мой общий вопрос:
При подключении компонентов с помощью IoC контейнер в коде (в отличие от для настройки через xml), вы обычно требуется явный проект/сборка ссылки на все сборки?
Почему отдельные сборки? Потому что:
"Абстрактные классы, находящиеся в отдельная сборка из их бетона реализации - отличный способ добиться такого разделения". - Рамки Руководства по проектированию стр .91
Пример:
Скажем, у меня есть PersonBase.dll и Bob.dll
Боб наследуется от абстрактного класса PersonBase. Они оба находятся в пространстве имен Person. Но в разных сборках.
Я программирую PersonBase, а не Боб.
В моем основном коде мне нужен человек. StructureMap может сканировать сборки. Отлично, я попрошу StructureMap для одного!
Теперь, в моем основном коде, я, конечно, ссылаюсь только на PersonBase, а не на Боба. На самом деле я не хочу, чтобы мой код ничего не знал о Бобе. Нет ссылок на проект, нет нутин. Это все.
Итак, я хочу сказать:
//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 a PersonBase (Bob). But no ?
ObjectFactory.GetAllInstances<PersonBase>().Count == 0
Не повезло. Что делает работа явной, что я хочу Боба:
//Reference: PersonBase.dll and Bob.dll
using Person;
...
Scan( x => {x.Assembly("Bob.dll"); }
//If I'm explicit, it works. But Bob just a PersonBase, what gives?
ObjectFactory.GetAllInstances<Bob>().Count == 1 //there he is!
Но теперь мне пришлось ссылаться на Bob.dll в моем проекте, чего я не хотел.
Я могу избежать этой ситуации, используя конфигурацию Spring + Xml. Но затем я вернусь к конфигурации Spring + Xml...!
Я что-то пропустил с помощью StructureMap или как общий принцип, делать (свободно) IoC конфигурациям нужны ссылки для всех сборок?
Возможно, связанный с этим вопрос: StructureMap и сборки сканирования