在 ASP.NET5 控制台应用程序中使用启动 class
Using Startup class in ASP.NET5 Console Application
ASP.NET 5-beta4 控制台应用程序(从 VS2015 中的 ASP.NET 控制台项目模板构建)是否可以使用 Startup
class 来处理注册服务和设置配置详细信息?
我试图创建一个典型的 Startup
class,但当 运行 控制台应用程序通过 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
class,但这似乎不是正确的解决方案,而且到目前为止还不允许我这样做配置服务。
我假设有一些方法可以让我创建一个 HostingContext
,它不会启动 Web 服务器,但会使控制台应用程序保持活动状态。大致如下:
HostingContext context = new HostingContext()
{
ApplicationName = "AppName"
};
using (new HostingEngine().Start(context))
{
// console code
}
但是到目前为止,我唯一能让它工作的方法是将 HostingContext.ServerFactoryLocation
设置为 Microsoft.AspNet.Server.WebListener
,这会启动 Web 服务器。
你正在寻找的是正确的想法,但我认为你需要支持一下。
首先,您可能已经注意到您的默认 Program
class 不再使用静态方法;这是因为构造函数实际上自己获得了一些依赖注入的爱!
public class Program
{
public Program(IApplicationEnvironment env)
{
}
public void Main(string[] args)
{
}
}
不幸的是,注册的 ASP.NET 5 托管环境没有您习惯的许多服务;感谢 this article 和 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
.[=19 中拥有了您想要的服务提供商=]
这里还有几个"gotchas",不妨一一列举:
- 如果您要求
IHostingEnvironment
,它将为空。那是因为托管环境来自 ASP.Net 5 托管。
- 因为你没有其中之一,你将没有你的
IHostingEnvironment.EnvironmentName
- 你需要自己从环境变量中收集它。其中,因为您已经将它加载到您的 Configuration 对象中,所以应该不是问题。 (它的名称是 "ASPNET_ENV",您可以在项目设置的“调试”选项卡中添加它;默认情况下,控制台应用程序不会为您设置此名称。无论如何,您可能想要重命名它,因为您不再真正谈论 ASPNET 环境。)
ASP.NET 5-beta4 控制台应用程序(从 VS2015 中的 ASP.NET 控制台项目模板构建)是否可以使用 Startup
class 来处理注册服务和设置配置详细信息?
我试图创建一个典型的 Startup
class,但当 运行 控制台应用程序通过 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
class,但这似乎不是正确的解决方案,而且到目前为止还不允许我这样做配置服务。
我假设有一些方法可以让我创建一个 HostingContext
,它不会启动 Web 服务器,但会使控制台应用程序保持活动状态。大致如下:
HostingContext context = new HostingContext()
{
ApplicationName = "AppName"
};
using (new HostingEngine().Start(context))
{
// console code
}
但是到目前为止,我唯一能让它工作的方法是将 HostingContext.ServerFactoryLocation
设置为 Microsoft.AspNet.Server.WebListener
,这会启动 Web 服务器。
你正在寻找的是正确的想法,但我认为你需要支持一下。
首先,您可能已经注意到您的默认 Program
class 不再使用静态方法;这是因为构造函数实际上自己获得了一些依赖注入的爱!
public class Program
{
public Program(IApplicationEnvironment env)
{
}
public void Main(string[] args)
{
}
}
不幸的是,注册的 ASP.NET 5 托管环境没有您习惯的许多服务;感谢 this article 和 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
.[=19 中拥有了您想要的服务提供商=]
这里还有几个"gotchas",不妨一一列举:
- 如果您要求
IHostingEnvironment
,它将为空。那是因为托管环境来自 ASP.Net 5 托管。 - 因为你没有其中之一,你将没有你的
IHostingEnvironment.EnvironmentName
- 你需要自己从环境变量中收集它。其中,因为您已经将它加载到您的 Configuration 对象中,所以应该不是问题。 (它的名称是 "ASPNET_ENV",您可以在项目设置的“调试”选项卡中添加它;默认情况下,控制台应用程序不会为您设置此名称。无论如何,您可能想要重命名它,因为您不再真正谈论 ASPNET 环境。)