如何在ASP.NET5控制台应用程序中使用启动类?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (19)

是否可以使用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);
  }
}

我试图Startup在我的Main方法中手动创建类,但这看起来不是正确的解决方案,迄今也没有允许我配置服务。

我假设有一些方法可以让我创建一个HostingContext不会启动Web服务器但会使控制台应用程序保持活动的方式。沿着以下方向的东西:

HostingContext context = new HostingContext()
{
  ApplicationName = "AppName"
};

using (new HostingEngine().Start(context))
{
  // console code
}

但是到目前为止,我能够实现这个目标的唯一方法就是如果我将HostingContext.ServerFactoryLocationto 设置为Microsoft.AspNet.Server.WebListener启动Web服务器。

提问于
用户回答回答于

你在找什么是正确的想法,但我认为你需要备份一下。

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

public class Program
{
    public Program(IApplicationEnvironment env)
    {            
    }        

    public void Main(string[] args)
    {
    }
}

不幸的是,从注册的ASP.NET 5托管环境中获取的服务并不是那么多; 感谢这篇文章IServiceManifest你可以看到只有少数服务可用:

Microsoft.Framework.Runtime.IAssemblyLoaderContainer Microsoft.Framework.Runtime.IAssemblyLoadContextAccessor Microsoft.Framework.Runtime.IApplicationEnvironment Microsoft.Framework.Runtime.IFileMonitor Microsoft.Framework.Runtime.IFileWatcher Microsoft.Framework.Runtime.ILibraryManager Microsoft.Framework.Runtime.ICompilerOptionsProvider Microsoft .Framework.Runtime.IApplicationShutdown

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

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- 你需要自己从环境变量中收集它。其中,因为已经将它加载到Configuration对象中,所以不应该成为问题。(它的名字是“ASPNET_ENV”,你可以在项目设置的Debug选项卡中添加这个名称;默认情况下这不是为控制台应用程序设置的,你可能想重命名它,因为你不是真的不再谈论ASPNET环境。)

扫码关注云+社区