DSL реестра StructureMap для сценария с именованным экземпляром
У меня есть сценарий, в котором мне нужно иметь возможность получить две разные реализации интерфейса IObjectContext
из StructureMap. Я знаю, что использование именованного экземпляра является ответом, но у меня возникли проблемы с DSL для этого, потому что класс "use" также одинаков в каждом случае, но с другим параметром конструктора.
Итак, способ создания этих объектов вне StructureMap заключается в следующем:
IObjectContext context1 = new ObjectContextAdapter(new Model1Entities());
IObjectContext context2 = new ObjectContextAdapter(new Model2Entities());
Как я могу выразить эту конфигурацию в StructureMap Registry DSL? Я знаю, что мне нужно использовать именованные экземпляры, но я не могу разобраться с остальной частью синтаксиса.
Спасибо!!!
2 ответа
Недавно мы столкнулись с подобной проблемой при попытке зарегистрировать несколько именованных экземпляров одного и того же конкретного типа (в нашем случае это было в пользовательском сканере) - Structuremap не позволяет вам делать это напрямую.
В конце мы должны были использовать метод ConstructedBy, передавая выражение, которое явно создает конкретный тип.
Стоит проверить здесь StructureMap - Настройка экземпляров в качестве отправной точки.
Редактировать: я думаю, что это то, что вы, вероятно, хотите в своем реестре (спасибо PHeiberg за предложение Add()):
For<IObjectContext>().Add(() => new ObjectContextAdapter(new Model1Entities())).Named("objectContext1");
For<IObjectContext>().Add(() => new ObjectContextAdapter(new Model2Entities())).Named("objectContext2");
В вашем случае это может быть не очень хорошим решением, но вы можете создать 2 отдельных класса адаптера, по одному для каждого экземпляра модели. Это проясняет тот факт, что объекты не одинаковы. Вы можете легко получить оба из одного базового класса, чтобы сделать реализацию очень простой.