[Signalr]讓Hub的Method也有intellisense
前言
如果有實做過signalr的話,會知道我們只要使用signalr都會繼承Hub來實做,這樣我們就可以實作有關signalr提供的很多server端的api,比如我們要主動通知全部的client或者是某個群組甚至是某個人,但是有時候我們想要達到的是別人來呼叫,然後在主動通知我們這邊的client端,所以我們需要實做api跟別人溝通,當然以我的首選都是會用web api,但是如果我們沒管理好Hub和Api的話,整個專案會變得很亂,因為我們不會知道某個Hub到底有用過哪些名稱,如果散落在web api的話,因為沒有事先定義的話,就必須要自行尋找,所以在這邊我想要讓Hub是會有intellisense,也可以約束member,只能使用介面有定義的名稱,而不能隨便自己取一個名稱去做。
Hub
以下是我們實做signalr的Hub,假設有以下這個呼叫,預設是弱性別的,也就是完全沒有intelisense,可以看到我自定義的名稱是沒有intellisense的
同時我如果要在web api定義主動通知client的話,也是完全不會有提示
定義Interface來約束可呼叫Signalr的method
首先我們就來定義Test這個method,我會在原有的Hub下面,定義相對這個Hub的介面,如下
{
public string Test(string Name)
{
Clients.All.Test(Name);
return Name;
}
}
public interface IDefault
{
void Test(string Name);
}
再來看看,這樣子就會有intellisense了
WebApi的部份,則是改成如下
{
// GET api/values
public IEnumerable<string> Get()
{
IHubContext<IDefault> hub = GlobalHost.ConnectionManager.GetHubContext<DefaultHub,IDefault>();
hub.Clients.All.Test("test");
return new string[] { "value1", "value2" };
}
}
再來看一下,WebApi呼叫的時候也會有Intellisense了
總結
我們都知道,當專案小的時候,我們都很容易可以想起來或找到自己曾經在哪寫過這些東西,但只要專案越來越大,好好的約束也是很重要的事,否則的話就連自己要找自己以前寫過的東西,都要花費不少時間,以上再請各位多多指教囉。