C# 从ASP.NET托管服务动态调用控制器
目标:拥有一个运行的托管服务处理队列(来自云服务),并将其动态路由到控制器。有点像php中的幼体框架调用jobs 当前实施情况:C# 从ASP.NET托管服务动态调用控制器,c#,asp.net,dynamic,asp.net-core,controller,C#,Asp.net,Dynamic,Asp.net Core,Controller,目标:拥有一个运行的托管服务处理队列(来自云服务),并将其动态路由到控制器。有点像php中的幼体框架调用jobs 当前实施情况: Type type = Type.GetType(nameSpace + ".Controllers." + sqsMessage.controller); Object obj = Activator.CreateInstance(type, null); MethodInfo methodInfo = type.GetMethod(sqsMessage.metho
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如果控制器构造函数以接口为参数,则可以使用依赖项注入来实现这一点 在.NETCore2.1中有一个简单的内置Ioc容器。要实现“控制器1”,您需要指定实现ILogger接口的类 您可以将其添加到ConfigureServices方法的Startup.cs中,如下所示:
public void ConfigureServices(IServiceCollection services)
{
// Dependency Injection
services.AddScoped<ILogger, MyLoggerClass>();
}
public void配置服务(IServiceCollection服务)
{
//依赖注入
services.addScope();
}
其中MyLoggerClass实现ILogger接口。任何时候,任何调用该接口作为参数的构造函数(无论是在控制器中还是在其他类中),Ioc容器都会初始化MyLoggerClass并自动传递它 你想做的事情听起来不是个好主意。控制器操作是在请求范围内调用的,因此在调用它们时总是有一个HTTP请求 但是,后台服务不在HTTP请求的范围内运行。他们故意跑出去。因此,从后台服务调用控制器看起来并不正确
如果您看到自己想要这样做,那么这是一个明显的迹象,表明您的控制器正在做太多的工作。您应该尝试将控制器操作中的逻辑提取到单独的服务中。这样,您的控制器和后台服务都可以依靠该公共服务来完成任务。感谢您的深入了解!我知道控制器操作是在请求范围内调用的。我试图理想地添加对“任意”Http端点的支持,这样我就不必为添加的每个Http端点添加另一个函数。然而,也许这只是我的懒惰。我想我会将您的建议与@gsxrboy73建议结合起来实施