如何从 SignalR MapHub 进程中的配置文件中读取 class 名称

How do I read class name from config file in SignalR MapHub process

我正在使用 SignalR 进行消息转发。 我想从配置文件中读取我的多个 Hub classes,因为我的项目会很大。 下面是 MapHub 操作示例,但我想从配置中读取 class 名称。

    public static void Configure(IApplicationBuilder app)
    {
        IConfiguration config = app.ApplicationServices.GetService<IConfiguration>();
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHub<MyHub>("/myHub");// standart
            endpoints.MapHub<"will be read from config file" > (config.GetSection("Hubs").GetValue(typeof(string), "MyHub").ToString());  
        });
    }

有什么办法吗? 如果你能帮上忙,我会很高兴。

您必须在此处使用 Reflection,因为 HubEndpointRouteBuilderExtensions class 不提供 MapHub 方法的 none-generic 版本。下面的代码应该适用于您的场景。

var extensionType = typeof(HubEndpointRouteBuilderExtensions);
var mapHubMethod = extensionType.GetMethod("MapHub", BindingFlags.Public | BindingFlags.Static, new[] { typeof(IEndpointRouteBuilder), typeof(string) });
var myHubTypeName = config.GetSection("Hubs").GetValue(typeof(string), "MyHub").ToString();
// Assume it is something like this : 
// "MyHubNameSpace.MyHub, MyAssembly, Version=1.2.3.0, Culture=neutral, PublicKeyToken=null"
var myHubType = Type.GetType(myHubTypeName); // read from config
var path = "foo"; // read from config
var genericMapHub = mapHubMethod!.MakeGenericMethod(myHubType);

app.UseEndpoints(endpoints =>
{
    genericMapHub.Invoke(null, new object[] { endpoints, path });
});

如果您的配置中有多个集线器,则需要多个 genericMapHub 方法信息:

var genericMyHub = mapHubMethod.MakeGenericMethod(myHubType);
var genericOtherHub = mapHubMethod.MakeGenericMethod(typeof(OtherHub));
var genericAnother =  mapHubMethod.MakeGenericMethod(typeof(AnotherHub));
// In practice this should be in a loop.