using System.Reflection; using Com.Ctrip.Framework.Apollo; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using NeoSmart.Caching.Sqlite; using Sln.Wcs.Repository; using Sln.Wcs.Serilog; using ZiggyCreatures.Caching.Fusion; using ZiggyCreatures.Caching.Fusion.Serialization.NewtonsoftJson; using System.Windows; using System.IO; using Sln.Wcs.UI.Page.Login; using Sln.Wcs.UI.Attribute; namespace Sln.Wcs.UI { /// /// Interaction logic for App.xaml /// public partial class App : Application { public static IServiceProvider ServiceProvider { get; private set; } protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); var services = new ServiceCollection(); ConfigureServices(services); ServiceProvider = services.BuildServiceProvider(); ServiceProvider.UseSerilogExtensions(); var config = ServiceProvider.GetService(); var log = ServiceProvider.GetService(); log.Info($"系统启动成功,日志存放位置:{config["logPath"]}"); var loginWindow = ServiceProvider.GetRequiredService(); loginWindow.WindowStartupLocation = WindowStartupLocation.CenterScreen; loginWindow.Show(); } private static void ConfigureServices(IServiceCollection services) { var basePath = AppContext.BaseDirectory; ApolloConfigureServices(services, ref basePath, out IConfiguration apolloConfiguration); Assembly[] assemblies = { Assembly.LoadFrom(Path.Combine(basePath, "Sln.Wcs.Common.dll")), Assembly.LoadFrom(Path.Combine(basePath, "Sln.Wcs.Cache.dll")), Assembly.LoadFrom(Path.Combine(basePath, "Sln.Wcs.Repository.dll")), Assembly.LoadFrom(Path.Combine(basePath, "Sln.Wcs.HikRoBotApi.dll")), //Assembly.LoadFrom(Path.Combine(basePath, "Sln.Wcs.HikRoBotSdk.dll")), }; services.Scan(scan => scan.FromAssemblies(assemblies) .AddClasses() .AsImplementedInterfaces() .AsSelf() .WithTransientLifetime()); // 扫描并注册带有特性的窗口和服务 services.Scan(scan => scan .FromAssemblyOf() .AddClasses(classes => classes.WithAttribute()) .AsSelf() .WithSingletonLifetime()); services.Scan(scan => scan .FromAssemblyOf() .AddClasses(classes => classes.WithAttribute()) .AsSelf() .WithTransientLifetime()); services.AddSingleton(typeof(SerilogHelper)); services.AddSqlSugarSetup(); services.AddFusionCache() .WithSerializer( new FusionCacheNewtonsoftJsonSerializer() ) .WithDistributedCache(new SqliteCache(new SqliteCacheOptions { CachePath = apolloConfiguration["cachePath"] })); } /// /// Apollo 配置中心 /// /// /// /// private static void ApolloConfigureServices(IServiceCollection services, ref string basePath, out IConfiguration apolloConfiguration) { var localConfiguration = new ConfigurationBuilder() .SetBasePath(basePath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); var apolloConfigSection = localConfiguration.GetSection("apollo"); services.AddSingleton(localConfiguration); var configurationBuilder = new ConfigurationBuilder() .SetBasePath(basePath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddApollo(apolloConfigSection) .AddDefault(); apolloConfiguration = configurationBuilder.Build(); services.Remove(new ServiceDescriptor(typeof(IConfiguration), localConfiguration)); services.AddSingleton(apolloConfiguration); } } }