StructureMap Registry DSL для сценария с именованным экземпляром

#.net #structuremap

#.net #structuremap

Вопрос:

У меня есть сценарий, в котором мне нужно иметь возможность получить две разные реализации интерфейса IObjectContext из StructureMap. Я знаю, что использование именованного экземпляра является ответом, но у меня возникли проблемы с DSL для этого, потому что класс для «использования» также одинаков в каждом случае, но с другим параметром конструктора.

Итак, способ создания этих объектов вне StructureMap заключается в следующем:

 IObjectContext context1 = new ObjectContextAdapter(new Model1Entities());
IObjectContext context2 = new ObjectContextAdapter(new Model2Entities());
  

Как я могу выразить эту конфигурацию в StructureMap Registry DSL? Я знаю, что мне нужно использовать именованные экземпляры, но я не могу разобраться в остальной части синтаксиса.

Спасибо!!!

Ответ №1:

Недавно мы столкнулись с аналогичной проблемой при попытке зарегистрировать несколько именованных экземпляров одного и того же конкретного типа (в нашем случае это было в пользовательском сканере) — Structuremap не позволяет вам делать это напрямую.

В итоге нам пришлось использовать метод ConstructedBy, передавая выражение, которое явно создавало экземпляр конкретного типа.

Стоит проверить здесь StructureMap — Настройка экземпляров в качестве отправной точки.

Редактировать: я думаю, что это то, что вы, вероятно, хотите в своем реестре (спасибо PHeiberg за предложение Add ()):

 For<IObjectContext>().Add(() => new ObjectContextAdapter(new Model1Entities())).Named("objectContext1");
For<IObjectContext>().Add(() => new ObjectContextAdapter(new Model2Entities())).Named("objectContext2");
  

Комментарии:

1. Это имеет смысл. Я попробую, когда вернусь через пару дней, и обновлю этот пост. Огромное спасибо!!!

2. Поскольку вы не хотите, чтобы экземпляры использовались по умолчанию, синтаксис должен быть: Для<…>().Add(() => …).Named(…);

3. Я попробовал следующее, которое, похоже, работает: Для<IObjectContext>().Use(() => new ObjectContextAdapter(new Model1Entities())).Named(«objectContext1»); (обратите внимание на использование «Использовать», а не «Добавить», я использую StructureMap 2.6.2.0).

Ответ №2:

Возможно, в вашем случае это не очень хорошее решение, но вы могли бы создать 2 отдельных класса адаптеров, по одному для каждого экземпляра объектов модели. Это проясняет тот факт, что объекты не являются одинаковыми. Вы могли бы легко получить оба из одного базового класса, чтобы упростить реализацию.