目标:拥有一个正在运行的托管服务处理队列(来自云服务),并将其动态路由到控制器。有点像使用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
答案 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请求的范围内运行。他们故意在外面跑。因此,从后台服务调用控制器似乎不正确。
如果您发现自己想要这样做,则表明您的控制器正在做过多的工作。您应该尝试将控制器操作中的逻辑提取到单独的服务中。这样一来,您的控制器和后台服务都可以依靠该通用服务来完成工作。