2012-06-26 3 views
1

Я рассматриваю структурную карту как инструмент IOC/DI. Глядя на этот пример:Задает конкретный тип для извлечения

http://docs.structuremap.net/QuickStart.htm

Единственное, что не имеет смысла, если я есть интерфейс и получить несколько конкретных типов из него, в коде:

общественного класса ClassThatGetsAnIValidator { public void SaveObject (object objectToSave) { // Идём получить правильный Ивалификатор из StructureMap Валидатор IValidator = ObjectFactory.GetInstance();

 var notification = validator.Validate(objectToSave); 
     if (notification.IsValid()) 
     { 
      // save the object 
     } 
    } 
} 

Как узнать, какой валидатор я получу? IE я могу иметь AlphaBetValidator, NumericValidator, и т.д., с различными комбинезонами метод и так далее .....

Я думаю, что это точка:

Регистрация «что» и «как» StructureMap должен строить или найти требуемые услуги (утомительная часть, но с годами она стала намного лучше)

Которое я изо всех сил пытаюсь понять.

Пожалуйста, помогите.

Благодаря

ответ

1

От documentation:

Если есть только один экземпляр для зарегистрированного PluginType, что Instance будет считаться по умолчанию для PluginType. В противном случае, если существует более одного экземпляра для типа PluginType, StructureMap должно быть явно указано, какой экземпляр является значением по умолчанию, , иначе вызов GetInstance() вызовет исключение (202).

Чтобы разрешить конкретный экземпляр, вы можете использовать механизм именования. На той же странице документации:

Иногда бывает полезно получить «именованный» экземпляр типа. Предположим, что вы создаете систему, которая должна подключаться к интерфейсу с несколькими внешними системами доставки. Вы разработали интерфейс для вашей системы под названием IShippingSystem, которая скрывает данные о каждой внешней доставке за адаптерами . Остальная часть вашего кода должна «знать», как взаимодействовать с IShippingSystem, но в какой-то момент , некоторый класс должен знать, как выбрать и получить правильный экземпляр IShippingSystem . До появления контейнеров IoC , таких как StructureMap, вы бы закодировали класс Factory и , возможно, класс Builder вручную для выполнения конструкции. С StructureMap этот код является просто вызовом метода ObjectFactory.GetNamedInstance (Тип, строка) .

IShippingService internationalService = ObjectFactory.GetNamedInstance<IShippingService>("International"); 

IShippingService domesticService = ObjectFactory.GetNamedInstance<IShippingService>("Domestic"); 
Смежные вопросы