是否可以使用自定义解析程序而不是hubname属性来解析信号器集线器?

时间:2014-02-12 00:54:12

标签: signalr ioc-container signalr-hub

我的所有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());

1 个答案:

答案 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()在此实现为扩展方法:

https://github.com/SignalR/SignalR/blob/2.0.2/src/Microsoft.AspNet.SignalR.Core/Hubs/Extensions/HubTypeExtensions.cs#L9

可以用您自己的IHubDescriptorProvider实现替换ReflectedHubDescriptorProvider,该实现调用您自己的GetHubName方法,但我认为这样会有点过分。

再一次,我认为使用HubName属性是最好的选择。