ABP理論学習のSignalR集積

6034 ワード

総ディレクトリに戻る

本編目録

  • 紹介
  • 取付
  • 接続を確立する
  • 内蔵機能
  • あなた自身のSignaRコード
  • 紹介する


    Abp.Web.SignalRはABPベースのアプリケーションでのSignalRの使用をかなり容易にする.SignalRの詳細については、SignalRドキュメントを参照してください.

    インストール


    サービス側


    App.Web.SignalRnugetパッケージは、あなたのプロジェクト(一般的にはwebレイヤ)にインストールされ、モジュールに依存を追加します.
    [DependsOn(typeof(AbpWebSignalRModule))]
    public class YourProjectWebModule : AbpModule
    {
        //...
    }
    

    次に、OWIN StartupクラスでMapSignalRメソッドを使用します.
    [assembly: OwinStartup(typeof(Startup))]
    namespace MyProject.Web
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                    app.MapSignalR();
    
                //...
            }
        }
    }
    

    注意:App.Web.SignalRはMicrosoftのみに依存する.AspNet.SignalR.Coreパッケージ.そのため、前にインストールしていない場合は、Microsoftも必要です.AspNet.SignalRはあなたのwebプロジェクトにインストールされます.

    クライアント


    ページにabpを追加するべきです.signalr.jsスクリプト.AppにありますWeb.Resourcesパッケージ(起動モジュールにインストールされています).signalrバスの後に含める必要があります.
    <script src="~/signalr/hubs"></script>
    <script src="~/Abp/Framework/scripts/libs/abp.signalr.js"></script>

    このようにして、SignalRは構成され、あなたのプロジェクトに統合されます.

    接続の確立


    ページにabpが含まれている場合.signalr.jsの場合、ABPはサーバ(クライアントから)に自動的に接続されます.一般的にはこれはいいですが、あなたがこのようなことをしたくない場合もあります.abpを含めてsignalr.jsの前に次のコードを追加して自動接続を閉じます.
    <script>
        abp.signalr = abp.signalr || {};
        abp.signalr.autoConnect = false;
    </script>

    これにより、サーバに接続する必要がある場合、abpを手動で呼び出すことができます.signalr.connect()関数.
    クライアントがサーバに接続されると、グローバルイベント「abp.signalr.connected」がトリガーされます.接続が正常に確立されると、イベントに登録して対応するアクションを実行できます.

    組み込み機能


    SignalRのすべての機能をアプリケーションで使用することができます.また、App.Web.SignalRパッケージには、いくつかの内蔵機能が実装されています.

    通知


    Abp.Web.SignalRパッケージは、IrealTimeNotifierを実装してクライアントにリアルタイム通知を送信します(「通知システム」を参照).したがって、ユーザーはリアルタイムのプッシュ通知を得ることができます.

    オンラインクライアント


    ABPは、オンラインユーザーに関する情報を取得するためにIOnlineClientManagerを提供します(たとえば、IOnlineClientManagerを注入し、GetByUserIdOrNull、GetAllClients、IsOnlineメソッドを使用します).正しく動作するためには、IOnlineClientManagerには通信インフラストラクチャが必要です.Abp.Web.SignalRはこのようなインフラストラクチャを提供しています.したがって、SignalRがインストールされている場合は、アプリケーションのどのレイヤでもIOnlineClientManagerを注入して使用できます.

    PascalCase vs. camelCase


    Abp.Web.SignalRパッケージは、シリアル化時にCamelCasePropertyNamesContractResolverを使用してSignalRのデフォルトのContractResolverを上書きします.したがって、サービス側のクラスにはPascalCaseプロパティがあり、クライアントではcamelCaseとしてオブジェクトを送信/受信するために使用されます(javascriptではcamelCaseがより人気のある名前であるため).一部のプログラムセットでこれを無視したい場合は、それらのプログラムセットをAppSignalRContractResolverに追加することができます.IgnoredAssembliesリストにあります.

    あなた自身のSignaRコード


    Abp.Web.SignalRパッケージもあなたのSignalRコードを簡略化しました.アプリケーションにハブ(Hub)を追加したいとします.
    public class MyChatHub : Hub, ITransientDependency
    {
        public IAbpSession AbpSession { get; set; }
    
        public ILogger Logger { get; set; }
    
        public MyChatHub()
        {
            AbpSession = NullAbpSession.Instance;
            Logger = NullLogger.Instance;
        }
    
        public void SendMessage(string message)
        {
            Clients.All.getMessage(string.Format("User {0}: {1}", AbpSession.UserId, message));
        }
    
        public async override Task OnConnected()
        {
            await base.OnConnected();
            Logger.Debug("A client connected to MyChatHub: " + Context.ConnectionId);
        }
    
        public async override Task OnDisconnected(bool stopCalled)
        {
            await base.OnDisconnected(stopCalled);
            Logger.Debug("A client disconnected from MyChatHub: " + Context.ConnectionId);
        }
    }
    

    私たちはITransientDependencyを実現して、私たちのハブhubを依存注入システムに登録することを簡略化しました(あなたのニーズに基づいて、それを単例の【singleton】).属性もsessionとloggerに注入した.
    SendMessageはhubの方法であり、クライアントによって使用することができる.この方法では,すべてのクライアントのgetMessage関数を呼び出すことができる.ご覧のように、AppSessionを使用して現在のユーザーIDを取得できます(ユーザーがシステムにログインしている場合).プレゼンテーションのために、OnConnectedとOnDisconnectedも書き換えましたが、実際にはここでは必要ありません.
    ここで、クライアントのjavascriptコードは、私たちのハブhubを使用して情報を送信/受信します.
    var chatHub = $.connection.myChatHub; //   hub   
    
    chatHub.client.getMessage = function (message) { //          
        console.log('received message: ' + message);
    };
    
    abp.event.on('abp.signalr.connected', function() { //       
    chatHub.server.sendMessage("Hi everybody, I'm connected to the chat!"); //        
    });

    そして、いつでもサーバにメッセージを送信する必要がある場合は、chatHubを使用することができます.ここで、SignalRの詳細については、SinalRドキュメントの表示をクリックしてください.