【问题标题】:Dynamically Call Controller from ASP.NET Hosted Service从 ASP.NET 托管服务动态调用控制器
【发布时间】:2019-01-18 11:20:42
【问题描述】:

目标:拥有一个正在运行的托管服务处理队列(来自云服务)并将它们动态路由到控制器。有点像 php 中的 Larval 框架调用作业。

当前实施

Type type = Type.GetType(nameSpace + ".Controllers." + sqsMessage.controller);
Object obj = Activator.CreateInstance(type, null);
MethodInfo methodInfo = type.GetMethod(sqsMessage.method);
result = methodInfo.Invoke(obj, sqsMessage.body);

为什么当前的实现不起作用: 控制器具有参数不同的构造函数,队列发送者不必负责传递这些参数:

示例:
控制器 1 - 构造函数 1 任务 ILogger 参数
控制器 2 - 构造函数采用零参数

问题:如何从正在运行的后台服务中动态调用控制器和特定操作?

使用 asp.net core 2.1

【问题讨论】:

    标签: c# asp.net dynamic asp.net-core controller


    【解决方案1】:

    您正在尝试做的事情听起来不是一个好主意。控制器操作是在请求范围内调用的,因此在调用它们时总会有一个 HTTP 请求。

    但是,后台服务在 HTTP 请求的范围内运行。他们故意跑到外面去。因此,从后台服务调用控制器看起来不正确。

    如果您发现自己想要这样做,那么这清楚地表明您的控制器正在做太多工作。您应该尝试将控制器操作中的逻辑提取到单独的服务中。这样一来,您的控制器和后台服务都可以依赖该公共服务来做事。

    【讨论】:

    • 感谢您提供更深入的见解!我了解控制器操作是在请求范围内调用的。我试图理想地添加对“任何” Http 端点的支持,这样我就不必为添加的每个 Http 端点添加另一个函数。但是,也许这只是我的懒惰。我想我会将您的建议与@gsxrboy73 建议结合起来实施
    【解决方案2】:

    如果您的控制器构造函数将接口作为参数,您可以使用依赖注入来完成此操作。

    在 .Net Core 2.1 中有一个简单的内置 Ioc 容器。要实现“控制器 1”,您需要指定实现 ILogger 接口的类。

    您可以在 Startup.cs 的 ConfigureServices 方法中添加它,例如:

    public void ConfigureServices(IServiceCollection services)
        {
            // Dependency Injection
            services.AddScoped<ILogger, MyLoggerClass>();
     }
    

    MyLoggerClass 实现 ILogger 接口的地方。任何时候任何构造函数将该接口作为参数调用(无论是在 Controller 还是其他类中),Ioc 容器都会初始化 MyLoggerClass 并自动将其传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 2021-10-29
      相关资源
      最近更新 更多