在引导程序CreateShell中使用模块中的服务

时间:2012-03-02 14:19:46

标签: c# silverlight prism mef

我在Silverlight中使用Prism并将我的代码基于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中有一个组件,它位于 ModulesCatalog.xaml 中设置为InitializationMode="WhenAvailable"的单独Xap中,因为我需要立即使用它。

我检查了断点,并在CreateModuleCatalog()方法之前调用CreateShell()方法,因此您认为我可以使用我导入的模块。但是,我注意到Initialize()之前没有调用我的模块CreateShell()为什么不呢?我能做些什么来使这项工作?

1 个答案:

答案 0 :(得分:1)

您的模块Initialize()未在CreateShell()之前调用,因为它尚未加载。 您可以使用IModuleManager.LoadModuleCompleted事件来查看模块的加载时间。

编辑:

不要将服务从其他模块导入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;
    }
}