Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从ASP.NET托管服务动态调用控制器_C#_Asp.net_Dynamic_Asp.net Core_Controller - Fatal编程技术网

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

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

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

当前实施情况

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建议结合起来实施