Създаване на библиотека Silverlight със зависимости, съставени чрез MEF

Имам библиотека Silverlight 4 L, която има зависимост, която трябва да бъде предоставена по време на изпълнение чрез плъгин 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