首页 > 代码库 > Prism4 文档翻译系列---第2章:初始化Prism应用程序
Prism4 文档翻译系列---第2章:初始化Prism应用程序
- 你需要去决定是否使用MEF,Unity或者其他的依赖注入容器,这将决定你将使用哪个引导程序类或者你需要自己为其他的依赖注入容器创建一个引导程序类
- 你需要考虑清楚应用程序的单独的服务,这需要在容器中被注册
- 决定是否使用内置的日志服务或者你需要自己创建另外的日志服务
- 决定模块是如何被应用程序查找并加载:代码方式明确声明,代码方式标记模块的属性,扫描路径,配置或者在XAML中
protected override DependencyObject CreateShell(){ return ServiceLocator.Current.GetInstance<Shell>();} |
实现InitializeShell 方法
当你创建了一个Shell之后,你将会运行初始化步骤来确保这个Shell已经可以被显示,根据你创建的是一个WPF或者Silverlight应用程序,这个InitalShell方法将会不同。
在Sliverlight应用程序中,你将会看到Shell作为应用程序的visual root,如下所示:
protected override void InitializeShell(){ Application.Current.RootVisual = Shell;} |
protected override void InitializeShell(){ Application.Current.MainWindow = Shell; Application.Current.MainWindow.Show();} |
protected override IModuleCatalog CreateModuleCatalog(){ // When using MEF, the existing Prism ModuleCatalog is still // the place to configure modules via configuration files. return ModuleCatalog.CreateFromXaml(new Uri( "/ModularityWithMef.Silverlight;component/ModulesCatalog.xaml", UriKind.Relative));} |
服务接口 | 描述 |
---|---|
IModuleManager | 定义检索并初始化应用程序模块的服务的接口。 |
IModuleCatalog | 包含应用程序的模块中的元数据。Prism库提供了几个不同的目录。 |
IModuleInitializer | 初始化模块 |
IRegionManager | 注册和检索的区域,这是可视化的容器进行布局。 |
IEventAggregator | 发布者和订阅者之间的松耦合事件的集合。 |
ILoggerFacade | 一个日志机制的封装,所以你可以选择你自己的日志记录机制, 例如,你可以 通过EnterpriseLibraryLoggerAdapter类使用企业级类库Stock Trader Reference Implementation (Stock Trader RI)记录应用程序块。通过在引导程序中Run方法使用的CreateLogger 方法的返回值,日志服务被注册在容器内。 在引导程序中不去重写CreateLogger 方法而在在容器中注册另一个记录器将不起作用。 |
IServiceLocator | 允许Prism类库访问容器,如果你想自定义或者扩展类库,它或许将很有用。 |
Stock Trader RI中的服务 | 描述 |
---|---|
IMarketFeedService | 提供了实时的 (模拟) 市场数据. 当从服务中收到数据时PositionSummaryPresentationModel 将会更新屏幕上的点的位置 |
IMarketHistoryService | 提供用于显示的趋势线所选基金历史市场数据。 |
IAccountPositionService | 提供资金的投资组合名单。 |
IOrdersService | 持续提交的买/卖订单。 |
INewsFeedService | 提供选定基金的新闻条目。 |
IWatchListService | 处理被添加到观察名单中的新条目 |
C# UnityBootstrapper.cs | |
---|---|
protected virtual void ConfigureContainer(){ ... if (useDefaultConfiguration) { RegisterTypeIfMissing(typeof(IServiceLocator), typeof(UnityServiceLocatorAdapter), true); RegisterTypeIfMissing(typeof(IModuleInitializer), typeof(ModuleInitializer), true); RegisterTypeIfMissing(typeof(IModuleManager), typeof(ModuleManager), true); RegisterTypeIfMissing(typeof(RegionAdapterMappings), typeof(RegionAdapterMappings), true); RegisterTypeIfMissing(typeof(IRegionManager), typeof(RegionManager), true); RegisterTypeIfMissing(typeof(IEventAggregator), typeof(EventAggregator), true); RegisterTypeIfMissing(typeof(IRegionViewRegistry), typeof(RegionViewRegistry), true); RegisterTypeIfMissing(typeof(IRegionBehaviorFactory), typeof(RegionBehaviorFactory), true); }} |
引导程序的RegisterTypeIfMissing 方法 决定了一个服务是否已经被注册,它不会被重复注册,这允许你可以通过配置来重写默认的注册信息,你也可以关闭默认注册任何服务;要做到这一点,使用重载Bootstrapper.Run方法并传入false。你也可以重写方法并且禁用你不想使用的服务,例如事件聚合器。
注意:如果你关闭的morning注册的服务,你需要手动的注册一些必须的服务。
为了扩展ConfigureContainer的默认行为,只需添加一个覆盖你的应用程序的引导程序的实现并且可选调用基类的实现,就像下面来自Modularity for WPF (with Unity) QuickStart中QuickStartBootstrapper工程中的代码一样,在它的实现中调用了基类的实现,注册了IModuleTracker的实现ModuleTracker类型,并且使用Unity注册了CallbackLogger的单例callbackLogger。
C# | |
---|---|
protected override void ConfigureContainer(){ base.ConfigureContainer(); this.RegisterTypeIfMissing(typeof(IModuleTracker), typeof(ModuleTracker), true); this.Container.RegisterInstance<CallbackLogger>(this.callbackLogger);} |
MefBootstrapper 类的CreateContainer 方法做了几件事情。首先,他创建了AssemblyCatalog 和CatalogExportProvider。CatalogExportProvider允许MefExtensions程序集提供一系列Prism类型的导出,而且允许你重写默认的注册。CreateContainer使用CatalogExportProvider创建并返回了CompositionContainer的实例,在大多数情况下,您不需要更改此功能;然而,该方法是虚方法,从而具有灵活性。
注意:在Silverlight中,由于安全限制,不能使用类型信息来检索程序集,作为替代,Prism使用另外的方法,就是使用Assembly.GetCalllingAssembly方法来实现。
在容器被创建之后,肯呢个需要为你的应用程序做些配置,在MefBootstrapper中ConfigureContainer的实现中默认注册了一系列Prism核心的服务,如下所示:如果重写此方法,慎重考虑是否应该调用基类的实现注册Prism核心服务,或者您会在您的实现提供这些服务。
C# | |
---|---|
protected virtual void ConfigureContainer(){ this.RegisterBootstrapperProvidedTypes();}protected virtual void RegisterBootstrapperProvidedTypes(){ this.Container.ComposeExportedValue<ILoggerFacade>(this.Logger); this.Container.ComposeExportedValue<IModuleCatalog>(this.ModuleCatalog); this.Container.ComposeExportedValue<IServiceLocator>(new MefServiceLocatorAdapter(this.Container)); this.Container.ComposeExportedValue<AggregateCatalog>(this.AggregateCatalog);} |
C# | |
---|---|
protected override void ConfigureAggregateCatalog(){ base.ConfigureAggregateCatalog(); // Add this assembly to export ModuleTracker this.AggregateCatalog.Catalogs.Add( new AssemblyCatalog(typeof(QuickStartBootstrapper).Assembly)); // Module A is referenced in in the project and directly in code. this.AggregateCatalog.Catalogs.Add( new AssemblyCatalog(typeof(ModuleA.ModuleA).Assembly)); // Module C is referenced in in the project and directly in code. this.AggregateCatalog.Catalogs.Add( new AssemblyCatalog(typeof(ModuleC.ModuleC).Assembly));} |
Prism4 文档翻译系列---第2章:初始化Prism应用程序