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);
}
}
}
}