ASP.NET 5-beta4控制台应用程序(从VS2015中的ASP.NET Console项目模板构建)是否可以使用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.ServerFactoryLocation
为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.RuntimeProvider.ICompiler .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
null。那是因为托管环境来自ASP.Net 5托管。IHostingEnvironment.EnvironmentName
-您需要自己从环境变量中收集数据。由于您已经将其加载到Configuration对象中,因此应该不会有问题。(它的名称是“ ASPNET_ENV”,您可以在项目设置的“调试”选项卡中添加它;默认情况下,控制台应用程序未为您设置此名称。无论如何,您可能都想重命名该名称,因为您实际上并没有不再谈论ASPNET环境。)本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句