2011-12-20 5 views
1

Я преобразующий проект Prism/MEF и нужно загрузить список модулей из центральной БДPrism/MEF - Когда для загрузки списка модулей для загрузки

однако «список Загрузчик» экземпляр Ссылка устанавливаются в нуль, так предполагая, что код не в нужном месте

Вот Поток

public class Bootstrapper : MefBootstrapper { 
    [Import] 
    IMyList sync1 { get; set; } 

    ... 
    protected override void ConfigureAggregateCatalog() { 
     **sync1.Sync();    // sync1 is null** 

     AggregateCatalog.Catalogs.Add(....) 
    } 
    ... 
} 


[Export(typeof(IMyList))] 
private class DBSync : IMyList { 
    [Import] IDBConn mydb { get; set; } 
    public void Sync(){ 
     // connects to mydb and gets a list of auth modules for the current user 
    } 
} 

к веро является sync1 IS NULL !! Зачем ?

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

ответ

0

Вы используете sync1 для настройки каталогов. Возможно ли, что вы еще не создали свои части?

Для деталей, которые необходимо компилировать, необходимо создать MEF, например, используя GetExportedValue <>, в противном случае IMyList будет пустым.

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

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

[Import] IDBConn mydb { get; set; } 

В этом случае вы должны получить исключение. Вы можете попробовать запустить программу при отладке, установив опцию для разрыва на всех исключениях для обычного языка Runtime Exceptions.

EDIT:

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

Вы должны:

Изменение IMyList sync1 так что это не импорт больше.

Если вам действительно нужен ваш IMyList, составленный MEF, вам необходимо создать временный контейнер (не нужно использовать MefBootStrapper) и использовать этот временный контейнер, чтобы составить компоненты в вашем классе начальной загрузки. Вы можете распоряжаться им позже. См. Другой ответ (Satisfy Imports in custom ExportProvider).

Я бы порекомендовал переходить к первому варианту жестко, меняя sync1, поэтому он не является импортом, если у вас нет веских оснований для этого.

+0

Проблема заключается в контейнере в Bootstrapper.ConfigureModuleCatalog(), где список модулей необходимо загружать после извлечения, используя Sync() – Kumar

0

Насколько я вижу, что вы не экспортировали IMyList. Therefor Я думаю, вам нужно поставить атрибут экспорта на строке перед частным классом DBCon

Я надеюсь, что это помогает ...

Найджел ...

+0

Извините, обновленные запросы, это было сделано в коде, но не показано в ques. – Kumar

Смежные вопросы