Prism 6.3升级至8.1技术咨询:替换Bootstrapper与日志实现
Prism 6.3 升级到 8.1 问题解答
1. 用PrismApplication替代Bootstrapper的方向是否正确?
完全正确。Prism 7.0及以上版本已废弃旧的Bootstrapper类,官方明确推荐使用PrismApplication作为WPF应用的启动入口。它整合了原Bootstrapper的核心逻辑,通过重写CreateShell、RegisterTypes、ConfigureModuleCatalog等方法即可完成应用初始化,代码结构更简洁,也符合Prism新版本的设计规范。
2. 集成EnterpriseLibrary.Logging.NetCore到Prism 8.1
实现步骤:
- 安装
EnterpriseLibrary.Logging.NetCoreNuGet包 - 实现Prism日志接口
ILoggerFacade的适配器,适配Enterprise Library的日志系统 - 在Prism容器中注册日志实例和适配器
示例代码:
日志适配器类
using Microsoft.Practices.EnterpriseLibrary.Logging; using Prism.Logging; using System.Diagnostics; public class EnterpriseLibraryLoggerAdapter : ILoggerFacade { private readonly LogWriter _logWriter; public EnterpriseLibraryLoggerAdapter(LogWriter logWriter) { _logWriter = logWriter; } public void Log(string message, Category category, Priority priority) { var logEntry = new LogEntry { Message = message, Severity = category switch { Category.Debug => TraceEventType.Verbose, Category.Info => TraceEventType.Information, Category.Warn => TraceEventType.Warning, Category.Error => TraceEventType.Error, Category.Exception => TraceEventType.Critical, _ => TraceEventType.Information }, Priority = (int)priority }; _logWriter.Write(logEntry); } }
在PrismApplication中注册日志
using Prism.Ioc; using Prism.Unity; using Microsoft.Practices.EnterpriseLibrary.Logging; using System.Diagnostics; using System.Windows; public partial class App : PrismApplication { protected override Window CreateShell() { return Container.Resolve<MainWindow>(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { // 配置Enterprise Library日志 var loggingConfig = new LoggingConfiguration(); // 添加控制台监听(可替换为文件、数据库等监听) var consoleListener = new ConsoleTraceListener { Name = "ConsoleListener" }; loggingConfig.AddLogSource("Default", SourceLevels.All, true) .AddTraceListener(consoleListener); var logWriter = new LogWriter(loggingConfig); // 注册LogWriter实例 containerRegistry.RegisterInstance(logWriter); // 注册Prism日志适配器,让Prism内部和业务代码共用该日志系统 containerRegistry.RegisterInstance<ILoggerFacade>(new EnterpriseLibraryLoggerAdapter(logWriter)); // 其他服务注册 containerRegistry.Register<IMyBusinessService, MyBusinessService>(); } protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { // 注册应用模块(如有) moduleCatalog.AddModule<YourFeatureModule>(); } }
3. Prism 6.3到7.0+的迁移要点及示例
核心迁移点:
- 启动类替换:将继承
Bootstrapper改为继承对应容器的PrismApplication(比如Prism.Unity.PrismApplication) - 容器配置方法替换:原
ConfigureContainer方法替换为RegisterTypes,使用IContainerRegistry进行服务注册 - 模块配置:
ConfigureModuleCatalog方法保留,用法基本一致,仍可通过moduleCatalog.AddModule添加模块 - 命名空间调整:部分API的命名空间变更,比如统一使用
Prism.Mvvm替换旧的同名命名空间(基本兼容,建议统一更新)
最简迁移后PrismApplication示例
using Prism.Ioc; using Prism.Unity; using System.Windows; namespace YourWpfApp { public partial class App : PrismApplication { // 创建主窗口,对应原Bootstrapper的CreateShell protected override Window CreateShell() { return Container.Resolve<MainWindow>(); } // 注册服务、视图模型等,对应原ConfigureContainer protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.Register<IDataService, DataService>(); containerRegistry.RegisterForNavigation<CustomerView, CustomerViewModel>(); } // 配置模块,对应原ConfigureModuleCatalog protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) { moduleCatalog.AddModule<InventoryModule.InventoryModule>(); } } }
内容的提问来源于stack exchange,提问作者Deepak HN
相关产品推荐
相关产品推荐

