Создание библиотеки Silverlight с зависимостями, составленными с помощью MEF

У меня есть библиотека L Silverlight 4, в которой есть зависимость, которая должна предоставляться во время выполнения через подключаемый модуль P.

Я использую DeploymentCatalog в соответствии с примером, приведенным в документации MEF и во всех все хорошо: XAP плагина P правильно загружается асинхронно и импорт выполняется.

Однако я не могу контролировать детали приложения Silverlight A, которое будет использовать библиотеку L, и я не могу исключить, что A само может захотеть использовать MEF: поэтому возможно, что в какой-то момент A может выдать CompositionHost.SatisfyImports(...) CompositionHost.Initialize(catalog) вызов для своих целей, который, как я понимаю, может быть вызван только один раз.

Я что-то упустил или разделение приложения на несколько XAP может быть достигнуто только в том случае, если у одного есть полный контроль над приложением и библиотеками Silverlight?

Стефано


person Stefano Ricciardi    schedule 17.05.2011    source источник


Ответы (3)


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

Вы можете создать свой собственный CompositionContainer, подключенный к DeploymentCatalog, и вызвать GetExports или SatisfyImports для созданного вами контейнера. CompositionHost — это просто оболочка статического CompositionContainer.

person Daniel Plaisted    schedule 17.05.2011

Обычно не рекомендуется привязывать себя к одному контейнеру внедрения зависимостей в библиотеке, вместо этого вы обычно хотите абстрагироваться от этого, используя что-то вроде CommonServiceLocator, который оставляет выбор контейнера IoC на усмотрение того, кто использует вашу библиотеку.

person MattDavey    schedule 18.05.2011
comment
Я не знал о библиотеке CommonServiceLocator. Я взгляну. - person Stefano Ricciardi; 18.05.2011

Я только месяц назад начал работать с MEF в Silverlight, так что я определенно не авторитет.

Первое, что я заметил, это то, что CompositionHost.SatisfyImports был заменен на CompositionInitializer.SatisfyImports . Во-вторых, я не смог найти ссылку на «SatisfyImports может быть вызван только один раз»
Мой сценарий следующий:

  • У меня есть BL xap, который я использую/ссылаюсь на свое приложение
  • BL имеет некоторые импорты, которые будут удовлетворены вызовом SatisfyImports из приложения.
  • В BL также есть некоторые импорты, которые не могут/не будут разрешены до тех пор, пока не будет загружен определенный пользовательский (сторонний) модуль/xap (загружается по требованию). Когда пользовательский модуль становится доступным (загружается), я решаю отсутствующий импорт с помощью дополнительного вызова CompositionInitializer.SatisfyImports:

E.g:

  If DomainSpecificModuleLogic Is Nothing Then  
     'this is required to trigger recomposition and resolve imports to the ThirdPartyModule
     System.ComponentModel.Composition.CompositionInitializer.SatisfyImports(Me)  
  End If

Итак, у меня есть несколько вызовов SatisfyImports (в разные моменты времени) и никаких проблем из-за этого -> вам не требуется контроль над всем приложением, просто убедитесь, что когда кто-то обращается к объекту из вашей библиотеки, использующей MEF, у вас есть вызов SatisfyImports
Примечание. мой BL является одноэлементным, поэтому наверняка я вызываю SatisfyImports для одного и того же объекта несколько раз.

person Ando    schedule 17.05.2011
comment
Спасибо за ваш ответ. К сожалению, я указал неправильное имя функции в своем первоначальном вопросе. Функция, которая может быть запущена только один раз, — CompositionHost.Initialize(catalog). - person Stefano Ricciardi; 18.05.2011