-1

Prism 应用程序的每次初始化都需要多少详细的复杂性?

如果事情是我们有两个类的高级视图:

1) UnityBootstrapper

2) MefBootstrapper

并根据经验和背景,您需要决定使用哪一个。引导程序为您做的是创建主窗口,也称为外壳,以及其他辅助的东西。问题是在这个过程中还有很多其他复杂的细节。我应该使用什么,我应该忽略什么,这令人难以置信的混乱?你们是怎么开始的?对于有经验的人,您今天是否关心初始化过程的细节,或者在大多数情况下您仍然不知道发生了什么,您只是使用一些旧的模板代码?

4

1 回答 1

0

只是为了给您一个想法,这是我认为非常复杂的应用程序的 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();
    }        
}

根本没有样板代码,因此不需要代码模板。或者这很难理解。与往常一样:尽可能少地使用,尽可能多地使用。如果你觉得你需要额外的功能或更复杂的配置、花哨的日志机制、自定义区域等等等等,你可以扩展你的代码,但我建议现在专注于核心的东西。

于 2013-09-19T07:31:52.127 回答