MEF: Несмотря на то, что приложение нашло и загрузило модули PRISM, приложение утверждает, что не может быть найдено - PullRequest
2 голосов
/ 07 августа 2011

Я использую MEF в своем приложении PRISM 4.0 для загрузки модулей. Чтобы быть уверенным, что они загружаются, я сделал мой Shell для импорта IPartImportsSatisfiedNotification. Затем в методе OnImportSatirsfied () я ясно вижу в отладчике, что оба модуля найдены. (См. Скриншот ниже)

enter image description here

Однако я продолжаю получать это сообщение об ошибке:

Невозможно найти модуль с типом «SalesContactManagement.Modules.NavigationModule.NavigationModule, SalesContactManagement.Modules.NavigationModule, версия = 1.0.0.0, Культура = нейтральная, PublicToken = null 'среди экспортируемых модулей. Делать убедитесь, что имя модуля в каталоге модулей соответствует указанному на ModuleExportAttribute для типа модуля.

Есть идеи, почему MEF не работает? Любая помощь высоко ценится.

UPDATE

Достаточно забавно, когда я очищаю NavigationModule до минимума, он отлично работает.

 [ModuleExport(typeof(NavigationModule))]
    public class NavigationModule : IModule
    {
        private readonly IRegionManager _regionManager;
        private readonly ToolbarViewModel _toolbarViewModel;

        public void Initialize()
        {

        }

        //[ImportingConstructor]
        //public NavigationModule(RegionManager regionManager)
        //{
        //    //_toolbarViewModel = toolbarViewModel;
        //    _regionManager = regionManager;
        //}
}

Но как только я помещаю туда ImportingContructor, для типов, которые уже зарегистрированы в Bootstrapper, происходит сбой. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 07 августа 2011

Я ничего не сделал с Призмой, но экспортируется ли тип IRegionManager? Ваш импортирующий конструктор в настоящее время:

[ImportingConstructor]
public NavigationModule(RegionManager regionManager) { }

Принимая во внимание, что это должно быть:

[ImportingConstructor]
public NavigationModule(IRegionManager regionManager) { }

Обратите внимание на разницу между классом RegionManager и интерфейсом IRegionManager в качестве аргумента конструктора.

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

[Export(typeof(ISomething)), PartCreationPolicy(CreationPolicy.NonShared)]

Или вы можете использовать ExportFactory, например ::

[Import] ExportFactory<ISomething> SomethingFactory { get; set; }
0 голосов
/ 07 августа 2011

Я рекомендую использовать Fusion Log Viewer , чтобы узнать, как загружаются модули.Программа просмотра журнала Fusion должна быть установлена ​​при установке Visual Studio (вы можете просто нажать «Пуск» + «Fusion» для ее поиска)

Возможные проблемы:

  1. Несоответствие версий
  2. Строгое несоответствие имени
  3. Несоответствие LoadContext
  4. Что-то еще

Fusion Log Viewer может помочь вам точно определить ошибку.

...