C00225155-02/C00225155/MegaRobo.C00225155/MegaRobo.C00225155App/AppService.cs

207 lines
9.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// AppService 类继承自 ApplicationBase承担着应用程序的初始化工作。
/// </summary>
public class AppService : ApplicationBase
{
private readonly LocalConfigBaseEx _localConfigBaseEx;
private readonly AppConfigService _appConfigService;
private readonly DatabaseLoggerOptions _databaseLoggerOptions = new();
/// <summary>
///初始化 LocalConfigBaseEx 和 AppConfigService 实例。
///创建一个 ImageBrush其图像源为 DataBox\\CompanyLogo.png。
///配置 ProjectInfo并将其赋值给 _appConfigService.ProjectInfo。
///把 _appConfigService 注册到 CoreService 中。
/// </summary>
/// <param name="coreService"></param>
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<object> { imageBrush }
};
}
/// <summary>
///初始化数据访问服务。
///从本地配置中获取数据库类型和连接字符串。
///若数据库类型或连接字符串为空,记录警告信息。
///若不为空,初始化数据访问服务,获取数据库当前时间,若成功则创建 LogEntity 和 Setting 表,并将数据访问服务注册到 CoreService 中。
///若存在警告信息,显示警告对话框。
/// </summary>
/// <returns></returns>
protected override Response InitDataAccess()
{
Response response = new Response();
List<string> warnMessageList = new();
//加载数据库服务
IDataAccessService dataAccessService = new DataAccessService();
string dbType = this._localConfigBaseEx.GetSettingContext<string>("DatabaseType", "System");
string dbConnString = this._localConfigBaseEx.GetSettingContext<string>("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<LogEntity>();
dataAccessService.CreateTable<Setting>();
//赋值接口的实现,方便日志存储至数据库
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;
}
/// <summary>
///从本地配置中获取日志级别。
///初始化 LoggerService。
///初始化日志记录器,并将其和 LoggerService 注册到 CoreService 中。
/// </summary>
protected override void InitLogger()
{
LogLevel minLevel = this._localConfigBaseEx.GetSettingContext<LogLevel>("LogLevel", "System");
var loggerService = new LoggerService();
this.Logger = loggerService.InitializeSample(minLevel, this._databaseLoggerOptions);
this.CoreService.RegisterInstance(this.Logger);
this.CoreService.RegisterInstance(loggerService);
}
/// <summary>
///加载皮肤样式文件,并将其注册到 CoreService 中。
///根据皮肤样式的主题名称,转换为对应的主题,并设置为应用程序的主题。
///设置当前线程的文化信息和本地化管理器。
/// </summary>
protected override void LoadTheme()
{
SkinStyle skinStyle = new SkinStyle().LoadFile();
this.CoreService.RegisterInstance(skinStyle);
skinStyle.ThemeName = this._localConfigBaseEx.GetSettingContext<string>("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();
}
/// <summary>
///显示加载服务窗口,等待加载完成。
///设置 ViewModelLocator 的 CoreService。
///创建并显示主窗口。
///若加载服务存在警告信息,记录错误日志并发送警报消息;若没有,则记录信息日志并发送桌面警报消息。
/// </summary>
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("加载服务组件完成.");
}
}
}
}