2014-02-12 24 views
1

我所有的SignalRHub都有自己的服務接口,這在客戶端用於類型安全呼叫;即不再提及字符串方法。可以使用自定義解析程序而不是hubname屬性來解析信號中心?

無論如何,使用此設置,我不得不使用接口名稱將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());

回答

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屬性是最好的選擇。

+0

提供我自己的HubDescriptorProvider會有什麼不足嗎? – Phaeze

+0

如果您在實施ReflectedHubDescriptorProvider更改後升級SignalR,則應用程序不會利用ReflectedHubDescriptorProvider的修復/改進功能,除非您手動修補自定義IHubDescriptorProvider。 – halter73

+0

好吧,也許我會嘗試Ninject示例使用的相同方法,並繼承該類,以便它可以回退到默認使用。謝謝你的幫助。 – Phaeze