在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服务器。
您正在寻找的是正确的想法,但我认为您需要稍后备份。
首先,您可能已经注意到,默认的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环境。(