我正在考虑使用微服务框架让Docker陷入困境。我已经看到了许多暴露端点被一些东西调用的例子(给我一个位置的天气,货币的汇率等)。我还没有看到任何有关如何替换我当前的Windows服务类型应用程序或订阅队列来完成其工作的应用程序的事情。
例如,假设我有一个Windows服务,每天凌晨2:00压缩给定目录中的所有文件并将它们放入不同的目录(然后发布一条消息,表明它已完成)。
我是否构建了一个asp.net核心"控制台应用程序"并添加一个startup.cs?我需要一个startup.cs或者只是一个启动方法吗?
就像我说的那样,很多演示建立一个微小的网络响应的演示,但如果我不想要/需要和端点,还有什么可做的。
答案 0 :(得分:1)
Startup.cs是特定于ASP.NET Core的,它本身就是一个Web堆栈,并在IIS后面托管了WebListener或Kestrel。
在控制台应用程序中,您不会使用传统的Startup.cs,虽然您可以拥有一致的基础,但它看起来会有所不同,因为您可以控制创建IoC容器(而不是而不是ASP.NET Core在Web应用程序中为您执行此操作)。通常,Startup.cs由WebHostBuilder
中的Program.cs
处理,以允许它在将IServiceCollection
传递给ConfigureServices
方法之前注入自己的内容。
你是对的,你需要一个控制台应用程序,在那里你自己做所有的事情。
public class Program
{
public IConfigurationRoot Configuration { get; private set; }
public IServiceProvider Provider { get; private set; }
public static void Main()
{
var programm = new Programm();
program.Run();
}
private void Run()
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
var services = new ServiceCollection();
ConfigureServices(services);
this.Provider = services.BuildServiceProvider();
var host = this.Provider.GetRequiredService<MyHost>();
// blocking operation, the host should be something that keeps the service running
// once it stops, the application stops too as there are no additional
host.Run();
}
private void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IMyService, MyService>();
services.AddSingleton<MyHost>();
...
}
}
您想要用作主机,取决于您。它可以是Azure Web任务/主机:
using(var jobHost = new JobHost(new JobHostConfiguration(Configuration.GetConnectionString("AzureWebJobsDashboard"))))
{
jobHost.RunAndBlock();
}
将启动并保持应用程序运行并接收在其中注册的Azure消息和事件。或者您使用一些其他后台任务框架,如Hangfire。
在ASP.NET Core中,所有这些都由框架处理,但ASP.NET Core是为Web内容而制作的,因此取决于端点。 ASP.NET Core应用程序中使用的Configure
类的Startup
方法中的大多数内容都是关于注册中间件,这些中间件适用于HttpContext
。你没有在没有端点的微服务中拥有这些。没有端点,没有HttpContext
,不需要中间件。
当然,您在控制台应用程序中也没有IApplicationBuilder
,只需IServiceProvider
来解析您之前注册的服务。