其它实现可以调用此方法 或者写类似的实现 核心代码Main:
public Program(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public void Main(string[] args)
{
var config = new Configuration();
if (File.Exists(HostingIniFile))
{
config.AddIniFile(HostingIniFile);
}
config.AddEnvironmentVariables();
config.AddCommandLine(args);
//Provider 是外部类通过构造函数传进来的
var services = HostingServices.Create(_serviceProvider, config)
.BuildServiceProvider();
//外部传进来的 serviceProvider 需要添加
var appEnv = services.GetRequiredService<IApplicationEnvironment>();
var hostingEnv = services.GetRequiredService<IHostingEnvironment>();// Create 时添加的
var context = new HostingContext()
{
Services = services,
Configuration = config,
ServerName = config.Get("server"),
ApplicationName = config.Get("app") ?? appEnv.ApplicationName,
EnvironmentName = hostingEnv.EnvironmentName, /* config.Get("ASPNET_ENV")??"Development" */
};
//GetRequiredService 和 GetService 的区别是 前者找不到会抛出异常
var engine = services.GetRequiredService<IHostingEngine>(); //HostingServices Add
var loggerFactory = services.GetRequiredService<ILoggerFactory>(); //HostingServices Add
var appShutdownService = _serviceProvider.GetRequiredService<IApplicationShutdown>(); //外部 serviceProvider 添加
var shutdownHandle = new ManualResetEvent(false);
//关键的东西应该在 engine.Start(context) 当中
var serverShutdown = engine.Start(context);
appShutdownService.ShutdownRequested.Register(() =>
{
try
{
serverShutdown.Dispose();
}
catch (Exception ex)
{
var logger = loggerFactory.Create<Program>();
logger.WriteError("TODO: Dispose threw an exception", ex);
}
shutdownHandle.Set();
});
var ignored = Task.Run(() =>
{
Console.WriteLine("Started");
Console.ReadLine();
appShutdownService.RequestShutdown();
});
shutdownHandle.WaitOne();
}
浙公网安备 33010602011771号