Prism / MEF - когда загружать список модулей для загрузки - PullRequest
1 голос
/ 20 декабря 2011

Я преобразую проект в 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 !!почему?

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

Ответы [ 2 ]

0 голосов
/ 21 декабря 2011

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

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

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

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

[Import] IDBConn mydb { get; set; }

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

РЕДАКТИРОВАТЬ:

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

Вам потребуется:

Изменить IMyList sync1, чтобы он больше не был импортом.

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

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

0 голосов
/ 20 декабря 2011

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

Надеюсь, это поможет ...

Найджел ...

...