【问题标题】:What asp.net Core project for MicroService without endpoint什么 asp.net Core 项目用于没有端点的微服务
【发布时间】:2017-01-28 23:49:13
【问题描述】:

我正在考虑使用微服务框架来挑战 Docker。我已经看到了许多暴露端点以被某事调用以做某事的示例(让我知道某个位置的天气、货币汇率等)。我还没有看到任何关于如何替换我当前的 Windows 服务类型应用程序或订阅队列来完成工作的应用程序的内容。

例如,假设我有一个 Windows 服务,它每天凌晨 2:00 压缩给定目录中的所有文件并将它们放入不同的目录(然后发布一条消息说它已完成)。

我是否构建一个 asp.net 核心“控制台应用程序”并添加一个 startup.cs?我需要一个 startup.cs 还是我的 main 中只需要一个启动方法?

就像我说的那样,有很多关于构建小型 Web 响应的演示,但很少有关于如果我不想要/不需要和端点还能做什么。

【问题讨论】:

    标签: asp.net asp.net-core microservices


    【解决方案1】:

    Startup.cs 非常特定于 ASP.NET Core,它本身就是一个 Web 堆栈,由 IIS 后面的 WebListener 或 Kestrel 托管。

    在控制台应用程序中,您不会使用传统的 Startup.cs,尽管您可以拥有一致的基础,但它看起来会有些不同,因为您可以控制创建 IoC 容器(而不是 ASP .NET Core 在 Web 应用程序中为您执行此操作)。通常,Startup.cs 由Program.cs 中的WebHostBuilder 处理,以允许它在将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 应用程序中使用的Startup 类的Configure 方法中的大部分内容都是关于注册中间件,这些中间件在HttpContext 上工作。在没有端点的微服务中没有这些。没有端点,没有HttpContext,不需要中间件。

    当然,您在控制台应用程序中也没有IApplicationBuilder,只有一个IServiceProvider 来解析您之前注册的服务。

    【讨论】:

    • 太好了,我会试一试并报告
    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2020-10-21
    • 2023-03-20
    • 1970-01-01
    • 2016-11-08
    相关资源
    最近更新 更多