我的所有SignalRHub都有自己的服务接口,这在客户端用于类型安全呼叫;即不再按字符串引用方法。
无论如何,通过此设置,我必须使用接口名称向所有集线器添加HubName属性。甚至可以通过这些接口解决集线器。
我确实尝试使用Ninject解析器替换GlobalHost和HubConfiguration对象中的解析器,但它似乎没有为集线器本身调用已解析的。
以下是集线器的示例:
[HubName("IFoobarService")]
public class FoobarHub : Hub, IFoobarService
{
public void Baz(BazDto dto)
{
Clients.Others.Baz(dto);
}
}
}
以下是我用来尝试将我的集线器与Ninject绑定的代码 kernel.Bind(x => x.FromThisAssembly() .SelectAllClasses() .InheritedFrom() .BindAllInterfaces());
答案 0 :(得分:2)
我认为使用HubName属性是最好的选择。
你可以提供你自己的IHubDescriptorProvider并将其注册到SignalR的DependencyResolver,但我不推荐它。
您可以在此处查看默认的IHubDescriptorProvider实现:https://github.com/SignalR/SignalR/blob/2.0.2/src/Microsoft.AspNet.SignalR.Core/Hubs/Lookup/ReflectedHubDescriptorProvider.cs#L56
请注意以下代码行:
var hubDescriptors = types
.Select(type => new HubDescriptor
{
NameSpecified = (type.GetHubAttributeName() != null),
Name = type.GetHubName(),
HubType = type
});
Type.GetHubName()在此实现为扩展方法:
你可以用您自己的IHubDescriptorProvider实现替换ReflectedHubDescriptorProvider,该实现调用您自己的GetHubName方法,但我认为这样会有点过分。
再一次,我认为使用HubName属性是最好的选择。