[Signalr]讓Hub的Method也有intellisense

[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的

1

 

同時我如果要在web api定義主動通知client的話,也是完全不會有提示

 

2

 

定義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了

 

3

 

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了

 

4

 

總結

 

我們都知道,當專案小的時候,我們都很容易可以想起來或找到自己曾經在哪寫過這些東西,但只要專案越來越大,好好的約束也是很重要的事,否則的話就連自己要找自己以前寫過的東西,都要花費不少時間,以上再請各位多多指教囉。