在ASP.NET5控制台应用程序中使用Startup类

six*_*nes 17 c# asp.net-core-mvc asp.net-core

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

我试图创建一个典型的Startup类,但是在通过dnx . runVisual 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

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

我假设有一些方法让我创建一个HostingContext不启动Web服务器但会使控制台应用程序保持活动状态.有点像:

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

using (new HostingEngine().Start(context))
{
  // console code
}
Run Code Online (Sandbox Code Playgroud)

不过到目前为止,我能得到这个工作的唯一方法是,如果我设置HostingContext.ServerFactoryLocationMicrosoft.AspNet.Server.WebListener,它启动Web服务器.

Mat*_*rey 18

您正在寻找的是正确的想法,但我认为您需要备份一下.

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

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

    public void Main(string[] args)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,您注册的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)
{
}
Run Code Online (Sandbox Code Playgroud)

这消除了您在标准ASP.NET 5项目中看到的许多魔力,现在您拥有了您想要的服务提供商Main.

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

  • 如果你要求IHostingEnvironment,它将为空.这是因为托管环境来自ASP.Net 5托管.
  • 既然你没有其中任何一个,你就会离开你IHostingEnvironment.EnvironmentName- 你需要自己从环境变量中收集它.其中,因为您已经将它加载到Configuration对象中,所以应该不是问题.(它的名称是"ASPNET_ENV",您可以在项目设置的"调试"选项卡中添加;默认情况下,这不是为控制台应用程序设置的.无论如何,您可能想要重命名,因为您不是真的再谈论ASPNET环境.)