如何从 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.
我正在使用 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.