Создание библиотеки Silverlight с зависимостями, составленными через MEF - PullRequest
1 голос
/ 17 мая 2011

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

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

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

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

Stefano

Ответы [ 3 ]

1 голос
/ 17 мая 2011

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

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

1 голос
/ 18 мая 2011

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

0 голосов
/ 17 мая 2011

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

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

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

Например:

  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 для одного и того же объекта несколько раз.

...