在ASP.NET5控制台应用程序

本文关键字:应用程序 控制台 NET5 ASP | 更新日期: 2023-09-27 17:49:18

ASP是否可能。NET 5-beta4控制台应用程序(根据VS2015中的ASP.NET控制台项目模板构建(是否使用Startup类来处理注册服务和设置配置详细信息?

我曾尝试创建一个典型的Startup类,但在通过dnx . run或在Visual Studio 2015中运行控制台应用程序时,似乎从未调用过它。

Startup.cs相当于

public class Startup
{
  public Startup(IHostingEnvironment env)
  {
    Configuration configuration = new Configuration();
    configuration.AddJsonFile("config.json");
    configuration.AddJsonFile("config.{env.EnvironmentName.ToLower()}.json", optional: true);
    configuration.AddEnvironmentVariables();
    this.Configuration = configuration;
  }
  public void ConfigureServices(IServiceCollection services)
  {
    services.Configure<Settings>(Configuration.GetSubKey("Settings"));
    services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationContext>(options => options.UseSqlServer(this.Configuration["Data:DefaultConnection:ConnectionString"]));
  }
  public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
  {
    loggerFactory.AddConsole(minLevel: LogLevel.Warning);
  }
}

我曾尝试在Main方法中手动创建Startup类,但这似乎不是正确的解决方案,而且到目前为止还不允许我配置服务。

我假设有某种方法可以创建一个HostingContext,它不会启动web服务器,但会使控制台应用程序保持活力。大致如下:

HostingContext context = new HostingContext()
{
  ApplicationName = "AppName"
};
using (new HostingEngine().Start(context))
{
  // console code
}

然而,到目前为止,我能做到这一点的唯一方法是将HostingContext.ServerFactoryLocation设置为Microsoft.AspNet.Server.WebListener,从而启动web服务器。

在ASP.NET5控制台应用程序

您正在寻找的是正确的想法,但我认为您需要稍后备份。

首先,您可能已经注意到,默认的Program类不再使用静态方法;这是因为构造函数实际上自己获得了一些依赖注入的爱!

public class Program
{
    public Program(IApplicationEnvironment env)
    {            
    }        
    public void Main(string[] args)
    {
    }
}

不幸的是,ASP提供的服务并没有您习惯的那么多。NET 5托管环境注册;感谢这篇文章和IServiceManifest,您可以看到只有几个服务可用:

微软。框架运行时。IAssemblyLoaderContainer微软框架运行时。IAssemblyLoadContextAccessor微软框架运行时。I应用程序环境微软框架运行时。IFileMonitor微软框架运行时。IFileWatcher微软框架运行时。I库管理员微软框架运行时。ICompilerOptionsProvider微软框架运行时。I应用程序关闭

这意味着您也将获得创建自己的服务提供商的乐趣,因为我们无法获得框架提供的服务提供商。

private readonly IServiceProvider serviceProvider;
public Program(IApplicationEnvironment env, IServiceManifest serviceManifest)
{
    var services = new ServiceCollection();
    ConfigureServices(services);
    serviceProvider = services.BuildServiceProvider();
}
private void ConfigureServices(IServiceCollection services)
{
}

这带走了你在标准ASP中看到的很多魔力。NET 5项目,现在您的Main中有了您想要的服务提供商。

这里还有一些"陷阱",所以我不妨把它们列出来:

  • 如果您要求IHostingEnvironment,它将为空。这是因为托管环境来自ASP。Net 5主机
  • 由于您没有这些,您将没有IHostingEnvironment.EnvironmentName——您需要自己从环境变量中收集它。既然您已经将其加载到配置对象中,这应该不会成为问题。(它的名称是"ASPNET_ENV",您可以将其添加到项目设置的"调试"选项卡中;默认情况下,这不是为控制台应用程序设置的。无论如何,您可能需要重命名它,因为您不再真正谈论ASPNET环境。(