首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ASP.NET5控制台应用程序中使用启动类

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

Stack Overflow用户
提问于 2015-05-15 18:53:19
回答 1查看 11.1K关注 0票数 17

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

我曾尝试创建一个典型的Startup类,但在通过dnx . run或在Visual Studio2015中运行控制台应用程序时,似乎从未调用过它。

Startup.cs相当于:

代码语言:javascript
复制
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服务器,但会使控制台应用程序保持活动状态。大致是这样的:

代码语言:javascript
复制
HostingContext context = new HostingContext()
{
  ApplicationName = "AppName"
};

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

然而,到目前为止,我唯一可以让它工作的方法是,如果我将HostingContext.ServerFactoryLocation设置为Microsoft.AspNet.Server.WebListener,这将启动web服务器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-15 20:47:45

您正在寻找的是正确的想法,但我认为您需要后退一段时间。

首先,您可能已经注意到,您的默认Program类不再使用静态方法;这是因为构造函数实际上完全依赖于它自己!

代码语言:javascript
复制
public class Program
{
    public Program(IApplicationEnvironment env)
    {            
    }        

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

不幸的是,您在ASP.NET 5托管环境中注册的服务并不多;多亏了this articleIServiceManifest,您可以看到只有几个服务可用:

Microsoft.Framework.Runtime.ICompilerOptionsProvider Microsoft.Framework.Runtime.IApplicationShutdown Microsoft.Framework.Runtime.IApplicationEnvironment Microsoft.Framework.Runtime.ICompilerOptionsProvider Microsoft.Framework.Runtime.IApplicationShutdown

Microsoft.Framework.Runtime.IAssemblyLoaderContainer Microsoft.Framework.Runtime.IAssemblyLoadContextAccessor Microsoft.Framework.Runtime.IFileMonitor Microsoft.Framework.Runtime.IFileWatcher Microsoft.Framework.Runtime.ILibraryManager

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

代码语言:javascript
复制
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,您将失去自己的‘ll-您需要自己从环境变量中收集它。既然您已经将其加载到您的配置对象中,这应该不是问题。(它的名称是"ASPNET_ENV",您可以将其添加到项目设置的Debug选项卡中;默认情况下,这不是为控制台应用程序设置的。无论如何,您可能想要重命名它,因为您实际上不再是在谈论ASP.NET环境。)
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30257710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档