Основаны ли контракты MEF ComposableParts на экземплярах? - PullRequest
1 голос
/ 07 июня 2010

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

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

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

Эта диаграмма может немного прояснить ситуацию:

alt text

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

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

[ImportingConstructor] открытый класс BlendProgram: IBlendProgram { public BlendProgram (Блендер Блендер) {} }

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

1 Ответ

1 голос
/ 07 июня 2010

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

...