从ASP.NET托管服务动态调用控制器

时间:2018-08-10 19:58:09

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

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

当前实施

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-ILogger参数的构造函数1任务
控制器2-构造函数采用零参数

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

使用asp.net core 2.1

2 个答案:

答案 0 :(得分:1)

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

.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并自动将其传递。

答案 1 :(得分:1)

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

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

如果您发现自己想要这样做,则表明您的控制器正在做过多的工作。您应该尝试将控制器操作中的逻辑提取到单独的服务中。这样一来,您的控制器和后台服务都可以依靠该通用服务来完成工作。