只是为了给您一个想法,这是我认为非常复杂的应用程序的 MEF 引导程序之一。直截了当,没有什么很难理解的。在后台,还有更多内容,例如自定义区域行为、适配器和整个 MEF 导出内容。
public class MainBootstrapper : MefBootstrapper
{
protected override Microsoft.Practices.Prism.Logging.ILoggerFacade CreateLogger()
{
return new Log4NetLogger();
}
protected override DependencyObject CreateShell()
{
return Container.GetExportedValue<Shell>();
}
protected override void ConfigureAggregateCatalog()
{
var currentFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? "";
AggregateCatalog.Catalogs.Add(new DirectoryCatalog(currentFolder));
AggregateCatalog.Catalogs.Add(new DirectoryCatalog(currentFolder + Settings.Default.ElementsFolder));
}
protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
{
var mappings = base.ConfigureRegionAdapterMappings();
mappings.RegisterMapping(typeof(RadPaneGroup), new RadPaneGroupRegionAdapter(ConfigureDefaultRegionBehaviors()));
mappings.RegisterMapping(typeof(Menu), new MenuRegionAdapter(ConfigureDefaultRegionBehaviors()));
return mappings;
}
protected override void InitializeShell()
{
var shellWindow = (Shell) Shell;
Application.Current.MainWindow = shellWindow;
shellWindow.Show();
shellWindow.InjectInitialViews();
}
protected override IRegionBehaviorFactory ConfigureDefaultRegionBehaviors()
{
ViewModelInjectionBehavior.RegionsToAttachTo.Add(RegionNames.ElementViewRegion);
var behaviorFactory = base.ConfigureDefaultRegionBehaviors();
behaviorFactory.AddIfMissing("AutoPopulateExportedViewsBehavior", typeof(AutoPopulateExportedViewsBehavior));
behaviorFactory.AddIfMissing("AutoPopulateExportedMenuItemsBehavior", typeof(AutoPopulateExportedMenuItemsBehavior));
behaviorFactory.AddIfMissing("ElementViewInjectionBehavior", typeof(ViewModelInjectionBehavior));
return behaviorFactory;
}
}
我从来没有真正使用过 Unity。Unity 需要显式配置,出于懒惰的原因,我不喜欢这种配置,如果 MEF 的行为不符合预期,MEF 可以作为 PITA 进行调试。
如果您将其分解为您真正需要的内容,那么在构建您的第一个 PRISM 应用程序时,引导序列会变得更加容易,因为您不需要注册自定义映射和自定义行为。
public class MainBootstrapper : MefBootstrapper
{
protected override DependencyObject CreateShell()
{
return Container.GetExportedValue<Shell>();
}
protected override void ConfigureAggregateCatalog()
{
var currentFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? "";
AggregateCatalog.Catalogs.Add(new DirectoryCatalog(currentFolder));
}
protected override void InitializeShell()
{
var shellWindow = (Shell) Shell;
Application.Current.MainWindow = shellWindow;
shellWindow.Show();
shellWindow.InjectInitialViews();
}
}
根本没有样板代码,因此不需要代码模板。或者这很难理解。与往常一样:尽可能少地使用,尽可能多地使用。如果你觉得你需要额外的功能或更复杂的配置、花哨的日志机制、自定义区域等等等等,你可以扩展你的代码,但我建议现在专注于核心的东西。