我在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()
为什么不呢?我能做些什么来使这项工作?
答案 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;
}
}