Использование службы из модуля в загрузчике CreateShell - PullRequest
0 голосов
/ 02 марта 2012

Я использую Prism с Silverlight и основываю свой код на MefBootstrapper.Это определение выглядит следующим образом:

public class MyBootstrapper : MefBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        return this.Container.GetExportedValue<MainPage>();
    }

    protected override void InitializeShell()
    {
        base.InitializeShell();

        App.Current.RootVisual = (UIElement)this.Shell;
    }

    protected override Microsoft.Practices.Prism.Modularity.IModuleCatalog CreateModuleCatalog()
    {
        return Microsoft.Practices.Prism.Modularity.ModuleCatalog.CreateFromXaml( new Uri( "/My;component/ModulesCatalog.xaml", UriKind.Relative ) );
    }

    protected override void ConfigureAggregateCatalog()
    {
        base.ConfigureAggregateCatalog();

        // Add this assembly
        this.AggregateCatalog.Catalogs.Add( new DeploymentCatalog() );
    }
}

MainPage имеет компонент в ImportingConstructor, который находится в отдельном Xap, который в ModulesCatalog.xaml имеет значение InitializationMode="WhenAvailable"как мне нужно сразу.

Я проверил с точками останова, и метод CreateModuleCatalog() вызывается перед методом CreateShell(), так что вы можете подумать, что я смогу использовать мой импортированный модуль.Тем не менее, я замечаю, что мой модуль Initialize() не вызывается раньше CreateShell() Почему бы и нет?И что я могу сделать, чтобы сделать эту работу?

1 Ответ

1 голос
/ 02 марта 2012

Ваш модуль Initialize() ранее не вызывался CreateShell(), потому что он еще не загружен. Вы можете использовать IModuleManager.LoadModuleCompleted Событие, чтобы увидеть, когда ваш модуль загружен.

EDIT:

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

moduleManager.LoadModuleCompleted += ModuleManagerLoadModuleCompleted;
...
private void ModuleManagerLoadModuleCompleted(object sender, LoadModuleCompletedEventArgs e)
{
    if(e.ModuleInfo.ModuleName == "YourModuleName")
    {
       var service = ServiceLocator.Current.GetInstance<IService>();
       ...
       moduleManager.LoadModuleCompleted -= ModuleManagerLoadModuleCompleted;
    }
}
...