using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Packing.Application.ServiceInject; using Packing.EntityFrameworkCore; using Packing.Wf.AutoMapper; using System.Reflection; using UtilExtensions; namespace Wf { internal static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); //生成 DI 容器 var services = new ServiceCollection(); ConfigureServices(services); var serviceProvider = services.BuildServiceProvider(); var mainForm = serviceProvider.GetRequiredService<MainForm>(); System.Windows.Forms.Application.Run(mainForm); } private static void ConfigureServices(IServiceCollection services) { //注册 FormMain 类 services.AddScoped<MainForm>(); //register configuration IConfigurationBuilder cfgBuilder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT")}.json", optional: true, reloadOnChange: false); IConfiguration configuration = cfgBuilder.Build(); services.AddSingleton(configuration); services.AddDbContext<PackingDbContext>(option => { var connectionString = configuration.GetConnectionString("Mysql"); var serverVersion = ServerVersion.AutoDetect(connectionString); option.UseMySql(connectionString, serverVersion, p => p.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery)); //移除外键 option.ReplaceService<IMigrationsModelDiffer, MigrationsModelDifferWithoutForeignKey>(); }); //注册分布式Id生成器 services.AddSnowflake(configuration); //注册AutoMapper services.AddAutoMapper(cfg => { cfg.AddProfile<PackingMapperProfile>(); }); //services inject var injectName = typeof(IService).Name; var injectTypes = Assembly.Load("Application").GetTypes().Where(p => p.IsClass); foreach (var t in injectTypes) { if (t.GetInterface(injectName) != null) services.AddScoped(t); } } } }