ASP.NET Core中的应用程序启动代码

时间:2016-08-19 20:32:36

标签: c# asp.net-core startup

阅读documentation for ASP.NET Core,有两种方法可以选择启动:配置和配置服务。

这些似乎都不是放置我想在启动时运行的自定义代码的好地方。也许我想在我的数据库中添加一个自定义字段(如果它不存在),检查特定文件,将一些数据存入我的数据库等等。我想运行一次的代码,只是在app start。

是否有首选或推荐的方法来执行此操作?

3 个答案:

答案 0 :(得分:14)

我同意OP。

我的情况是我想在服务注册表中注册微服务,但在微服务运行之前无法知道端点是什么。

我觉得Configure和ConfigureServices方法都不理想,因为它们都不是为了进行这种处理而设计的。

另一种情况是想要加热缓存,这也是我们可能想做的事情。

接受的答案有几种替代方案:

  • 创建另一个在您网站之外执行更新的应用程序,例如部署工具,它在启动网站之前以编程方式应用数据库更新

  • 在您的Startup类中,使用静态构造函数确保网站已准备好启动

<强>更新

我认为最好的办法是使用IApplicationLifetime界面,如下所示:

public class Startup
{
    public void Configure(IApplicationLifetime lifetime)
    {
        lifetime.ApplicationStarted.Register(OnApplicationStarted);
    }

    public void OnApplicationStarted()
    {
        // Carry out your initialisation.
    }
}

答案 1 :(得分:8)

基本上,启动时此类自定义代码有两个入口点。

1。)Main方法

由于ASP.NET Core应用程序已经将良好的旧Main方法作为入口点,因此您可以在ASP.NET Core启动之前放置代码,例如

public class Program
{
    public static void Main(string[] args)
    {
        // call custom startup logic here
        AppInitializer.Startup();

        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();

        host.Run();
    }
}

2.。)使用Startup班级

正如您在问题中所说,ConfigureConfigureServices是自定义代码的好地方。

我更喜欢Startup课程。从运行时的角度来看,如果在启动时或在host.Run()调用之前的其他地方调用调用,则无关紧要。但是从程序员的角度来看,谁已经习惯了ASP.NET框架,那么他第一次看到这样的逻辑就是Startup.cs文件。所有样本和模板都为Identity,Entity Framework初始化等提供了逻辑。因此,作为惯例,我建议将初始化内容放在那里。

答案 2 :(得分:4)

这可以通过创建IHostedService实现并在启动类的IServiceCollection.AddHostedService<>()中使用ConfigureServices()注册实现来实现。

示例

using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;

public class MyInitializer : IHostedService
{
    public Task StartAsync(CancellationToken cancellationToken)
    {
        // Do your startup work here

        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        // We have to implement this method too, because it is in the interface

        return Task.CompletedTask;
    }
}
using Microsoft.Extensions.DependencyInjection;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddHostedService<MyInitializer>();
    }
}

注释