阅读documentation for ASP.NET Core,有两种方法可以选择启动:配置和配置服务。
这些似乎都不是放置我想在启动时运行的自定义代码的好地方。也许我想在我的数据库中添加一个自定义字段(如果它不存在),检查特定文件,将一些数据存入我的数据库等等。我想运行一次的代码,只是在app start。
是否有首选或推荐的方法来执行此操作?
答案 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
班级
正如您在问题中所说,Configure
和ConfigureServices
是自定义代码的好地方。
我更喜欢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>();
}
}
IHostedService
实现。