我有一个像这样的简单SignalR集线器类:
public class FooHub : Hub<IBar>
{
public async Task Hello(string text)
{
await this.Clients.Caller.SaySomething (text);
}
}
基本上,当客户端在服务器上调用Hello
时,这将回调到客户端的SaySomething
函数,该函数在接口IBar
上声明:
public interface IBar
{
Task OrderBeverage();
Task SaySomething(string text);
}
这与SignalR的魔力一起工作正常。基本上,上面的Caller
属性返回动态生成的代理的实例,该代理实现IBar
。
但是,如果我通过应用Interface Segregation Principle重写IBar
,就像这样:
public interface IBar : IOrder, ISmallTalk
{
}
public interface IOrder
{
Task OrderBeverage();
}
public interface ISmallTalk
{
Task SaySomething(string text);
}
应该在功能上完全相同,我在尝试调用Caller
返回的IBar
代理时遇到崩溃,但有以下异常:
类型&#39; System.TypeLoadException&#39;的第一次机会异常。发生在mscorlib.dll
其他信息:方法&#39; SaySometing&#39;在类型&#39; IBar&#39;从装配 &#39; Microsoft.AspNet.SignalR.Tests.Server.Hubs.TypedClient,Version = 0.0.0.0, Culture = neutral,PublicKeyToken = null&#39;没有实施。
我花了很长时间才弄清楚我必须直接将所有方法都放入IBar
,以便SignalR的Hub<T>
实现正常工作。
这是设计的吗?我错过了什么吗?