using CommunityToolkit.Mvvm.Messaging; using MegaRobo.C00225155.AppServer; using MegaRobo.C00225155.DataAccess; using MegaRobo.Contract; using MegaRobo.Entities.ViewTT; using MegaRobo.Entities; using MegaRobo.Logger.Loggers.Database; using MegaRobo.Logger; using MegaRobo.WpfComponents.Servers; using MegaRobo.WpfInfrastructure.Abstractions; using MegaRobo.WpfInfrastructure.ResourceBox; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Windows.Media.Imaging; using System.Windows.Media; using Telerik.Windows.Controls; namespace MegaRobo.C00225155App { /// /// AppService 类继承自 ApplicationBase,承担着应用程序的初始化工作。 /// public class AppService : ApplicationBase { private readonly LocalConfigBaseEx _localConfigBaseEx; private readonly AppConfigService _appConfigService; private readonly DatabaseLoggerOptions _databaseLoggerOptions = new(); /// ///初始化 LocalConfigBaseEx 和 AppConfigService 实例。 ///创建一个 ImageBrush,其图像源为 DataBox\\CompanyLogo.png。 ///配置 ProjectInfo,并将其赋值给 _appConfigService.ProjectInfo。 ///把 _appConfigService 注册到 CoreService 中。 /// /// public AppService(ICoreService coreService) : base(coreService) { this._localConfigBaseEx = new LocalConfigBaseEx(); this._appConfigService = new AppConfigService(); this.CoreService.RegisterInstance(this._appConfigService); ImageBrush imageBrush = new ImageBrush(new BitmapImage(new Uri("DataBox\\CompanyLogo.png", UriKind.RelativeOrAbsolute))); this._appConfigService.ProjectInfo = new ProjectInfo { Code = "C00225155", MadeCompany = "苏州镁伽科技有限公司", Company = "高通量合成仪", Title = "高通量合成仪", Subtitle = "", TechnicalAssistance = "苏州镁伽所有版权", CompanyLogos = new List { imageBrush } }; } /// ///初始化数据访问服务。 ///从本地配置中获取数据库类型和连接字符串。 ///若数据库类型或连接字符串为空,记录警告信息。 ///若不为空,初始化数据访问服务,获取数据库当前时间,若成功则创建 LogEntity 和 Setting 表,并将数据访问服务注册到 CoreService 中。 ///若存在警告信息,显示警告对话框。 /// /// protected override Response InitDataAccess() { Response response = new Response(); List warnMessageList = new(); //加载数据库服务 IDataAccessService dataAccessService = new DataAccessService(); string dbType = this._localConfigBaseEx.GetSettingContext("DatabaseType", "System"); string dbConnString = this._localConfigBaseEx.GetSettingContext("DatabaseConnString", "System"); if (string.IsNullOrWhiteSpace(dbType) || string.IsNullOrWhiteSpace(dbConnString)) { if (string.IsNullOrWhiteSpace(dbType)) { warnMessageList.Add("数据库类型为空"); } if (string.IsNullOrWhiteSpace(dbConnString)) { warnMessageList.Add("数据库字符串DatabaseConnString为空"); } } else { dataAccessService.Initialize(dbConnString, dbType); DateTime? dbTime = dataAccessService.GetCurrentTime(out string exMsg); if (dbTime != null) { dataAccessService.CreateTable(); dataAccessService.CreateTable(); //赋值接口的实现,方便日志存储至数据库 this._databaseLoggerOptions.LoggerDataService = dataAccessService; // this._appConfigService.DatabaseLoggerOptions.LoggerDataService = dataAccessService; //初始化数据表结构 } else { var warnMsg = $"加载数据库服务失败.Ex:{exMsg}"; warnMessageList.Add(warnMsg); } } this.CoreService.RegisterInstance(dataAccessService); if (!warnMessageList.Any()) return response; string errMsg = string.Join(Environment.NewLine, warnMessageList); errMsg = Utility.TextString.StringHelper.StringSplit(errMsg, 40); RadWindow.Alert(errMsg + Environment.NewLine); response.ErrorMessage = errMsg; return response; } /// ///从本地配置中获取日志级别。 ///初始化 LoggerService。 ///初始化日志记录器,并将其和 LoggerService 注册到 CoreService 中。 /// protected override void InitLogger() { LogLevel minLevel = this._localConfigBaseEx.GetSettingContext("LogLevel", "System"); var loggerService = new LoggerService(); this.Logger = loggerService.InitializeSample(minLevel, this._databaseLoggerOptions); this.CoreService.RegisterInstance(this.Logger); this.CoreService.RegisterInstance(loggerService); } /// ///加载皮肤样式文件,并将其注册到 CoreService 中。 ///根据皮肤样式的主题名称,转换为对应的主题,并设置为应用程序的主题。 ///设置当前线程的文化信息和本地化管理器。 /// protected override void LoadTheme() { SkinStyle skinStyle = new SkinStyle().LoadFile(); this.CoreService.RegisterInstance(skinStyle); skinStyle.ThemeName = this._localConfigBaseEx.GetSettingContext("ThemeName", "System"); // //https://docs.telerik.com/devtools/wpf/styling-and-appearance/themes-suite/color-theme-generator // string theme = skinStyle.ThemeName; // // Theme appTheme = null; // var themeNames = Telerik.Windows.Controls.ThemeManager.StandardThemeNames; // string names = string.Join(",", themeNames); // if(theme == "Windows8") // { // Windows8Palette.Palette.FontSize = 15; // Windows8Palette.Palette.FontFamily = new FontFamily("Consolas"); // //Windows8Palette.Palette.FontFamily = new FontFamily("Microsoft YaHei"); // appTheme = new Windows8Theme(); // } else if(theme == "Windows11") // { // Windows11Palette.Palette.FocusThickness = new Thickness(0.2d); // Windows11Palette.Palette.FontSize = 15; // Windows11Palette.Palette.FontFamily = new FontFamily("Consolas"); // //Windows11Palette.Palette.FontFamily = new FontFamily("Microsoft YaHei"); // appTheme = new Windows11Theme(Windows11Palette.ColorVariation.Light); // }else if(theme == "Fluent") // { // appTheme = new FluentTheme(); // FluentPalette.LoadPreset(FluentPalette.ColorVariation.Light); // } StyleManager.ApplicationTheme = new ThemeService().Convert(skinStyle.ThemeName, out ThemePalette themePalette); System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CurrentCulture; System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.CurrentCulture; LocalizationManager.Manager = new CustomLocalizationManager(); } /// ///显示加载服务窗口,等待加载完成。 ///设置 ViewModelLocator 的 CoreService。 ///创建并显示主窗口。 ///若加载服务存在警告信息,记录错误日志并发送警报消息;若没有,则记录信息日志并发送桌面警报消息。 /// protected override async void LauncherWindow() { //显示加载服务窗口 StartupService startupService = new StartupService(this.CoreService); await startupService.ShowWindow(this._appConfigService.ProjectInfo); //必须用await调用 ViewModelLocator.CoreService = this.CoreService; //声明主窗口 MainWindow mainWindow = new MainWindow() { CoreService = this.CoreService }; //配置弹窗 // DialogService dialogService = new(mainWindow); // this.CoreService.RegisterInstance(dialogService); //显示主窗口,放在最后显示,方便显示错误报警信息 mainWindow.Show(); //显示加载服务的结果 var warnMessageList = startupService.WarnMessageList.Where(x => !string.IsNullOrWhiteSpace(x)).ToList(); if (warnMessageList.Any()) { string warnMsg = "加载失败.详细信息:" + Environment.NewLine + string.Join(Environment.NewLine, Enumerable.Range(1, warnMessageList.Count).Select(i => $"{i}. {warnMessageList[i - 1]}")); this.Logger.LogError(warnMsg); WeakReferenceMessenger.Default.Send(new AlertMessage { Content = warnMsg + Environment.NewLine }); } else { WeakReferenceMessenger.Default.Send(new DesktopAlertMessage { Content = "加载服务组件完成." }); this.Logger.LogInformation("加载服务组件完成."); } } } }