2010-06-07 2 views
1

Я действительно не знал, как сформулировать заголовок моих вопросов, так что извиняюсь заранее. Я прочитал части документации MEF, чтобы попытаться найти ответ на мой вопрос, но не смог его найти.Составляющие MEF-файлы ComposableParts основаны на экземплярах?

Я использую ImportMany, чтобы MEF мог создавать несколько экземпляров определенного плагина. Этот плагин Импортирует несколько частей, и в пределах вызовов конкретного экземпляра он хочет, чтобы эти Импорты были одиночными. Однако я не хочу, чтобы все экземпляры этого плагина использовали один и тот же синглтон.

Например, скажем, мое приложение ImportMany s Техника блендера. Каждый раз, когда я прошу об этом, я хочу другого Блендера. Тем не менее, каждый Blender Import s ControlPanel. Я хочу, чтобы у каждого Blender был свой собственный ControlPanel. Чтобы сделать вещи более интересными, каждый Blender может загружать BlendPrograms, которые также содержатся в их собственных сборках, и MEF заботится об этой загрузке. Чтобы получить скорость, BlendProgram может потребоваться доступ к ControlPanel, но я хочу убедиться, что он обращается к правильному ControlPanel (то есть к тому, который связан с Blender, связанным с программой!)

Эта диаграмма может убрать вещи немного:

alt text

Как нотных шоу, я считаю, что путаница может исходить от сути, плохой дизайн. BlendProgram не должен касаться ControlPanel напрямую, и, возможно, BlendProgram должен получить скорость через Blender, который затем делегирует запрос на ControlPanel.

Если это так, то я предполагаю, что BlendProgram должен иметь ссылку на конкретный Blender. Для того чтобы это сделать, это правильный способ использовать MEF и использовать ImportingConstructor для BlendProgram, т.е.

[ImportingConstructor] общественного класса BlendProgram: IBlendProgram { общественного BlendProgram (блендер блендер) {} }

И если это так, откуда я узнаю, что MEF будет использовать предполагаемый плагин Blender?

ответ

1

Вы должны сломать его, как упомянуто. Покажите свою панель управления через ваш блендер, как вы говорите. Если вы действительно хотите сохранить свой текущий дизайн, вам нужно будет украсить импорт метаданными и создать собственный поставщик экспорта, который будет использовать эти метаданные, чтобы определить, какой экспорт он должен использовать. Если вы можете избавиться от этого дополнительного шага, сделайте это.

+0

Я решил, что мне придется сломать эту ассоциацию, потому что это просто похоже на правильный способ сделать это, но мой другой вопрос остается - как я могу обеспечить, чтобы BlendProgram был связан с правильным Blender? Поскольку MEF контролирует разрешение обоих экземпляров, автоматически ли он передает правильный экземпляр конструктору импорта, так как я ожидаю, что он «просто узнает», что конкретный Blender хотел разрешить эту BlenderProgram? – Dave

Смежные вопросы