Prism app每次初始化需要多少详细的复杂性?

时间:2013-09-18 17:37:11

标签: c# wpf visual-studio-2012 mvvm prism

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

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

1) UnityBootstrapper

2) MefBootstrapper

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

1 个答案:

答案 0 :(得分:0)

只是为了给你一个想法,这是我认为非常复杂的应用程序的MEF bootstrappers之一。这是直截了当的,真的很难理解。在后台,还有更多内容,例如自定义区域行为,适配器和整个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可以是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();
    }        
}

根本没有锅炉板代码,所以不需要代码模板。或者很难理解。一如既往:尽可能少地使用,尽可能多地使用。如果您觉得需要其他功能或更复杂的配置,花哨的日志记录机制,自定义区域等等,您可以扩展您的代码,但我建议您现在专注于核心事项。