导航

08-007 Hosting 之 Program

Posted on 2015-04-07 12:48  DotNet1010  阅读(187)  评论(0)    收藏  举报

 其它实现可以调用此方法 或者写类似的实现  核心代码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();
        }