2

私のアプリ フローは次のとおりです (わかりやすくするために簡略化しています)。

  1. ユーザーは「/page1」からページを取得します
  2. ユーザーはページ上でアクションを実行し (テキストの追加、クリックなど)、Signalr はこのデータをサーバーに通信し、サーバーはバックグラウンドで大量の計算を実行し、それらの結果がページに返されます (それらを「X」と呼びましょう)。 」)。
  3. ユーザーがページの操作を終了すると、Nancy から返された "/page2" へのリンクをクリックします。このページは、 Xに依存するモデルを使用して構築されています。

では、X に基づいてそのモデルを構築するにはどうすればよいでしょうか。Nancy が認識できるように、signalr はユーザー セッションにどのように書き込むことができますか?

(私は「きれいな」方法を探しています)

4

2 に答える 2

8

SignalrとNancyの正式な統合が保留されている間、これが私が持ってきたものです。基本的に、私は2つの間でIOCコンテナーを共有し、ユーザーを状態にマップするオブジェクト(シングルトンライフタイム)を使用します。

組み込みのTinyIOCを使用してIOCコンテナを共有する方法:

  1. SignalrのDefaultDependencyResolverを拡張する

    public class TinyIoCDependencyResolver : DefaultDependencyResolver
    {
        private readonly TinyIoCContainer m_Container;
    
        public TinyIoCDependencyResolver(TinyIoCContainer container)
        {
            m_Container = container;
        }
    
        public override object GetService(Type serviceType)
        {
            return m_Container.CanResolve(serviceType) ? m_Container.Resolve(serviceType) : base.GetService(serviceType);
        }
    
        public override IEnumerable<object> GetServices(Type serviceType)
        {
            var objects = m_Container.CanResolve(serviceType) ? m_Container.ResolveAll(serviceType) : new object[] { };
            return objects.Concat(base.GetServices(serviceType));
        }
    }
    
  2. SignalrのデフォルトのDependencyResolverを新しいものに置き換えます

    public class Bootstrapper : DefaultNancyBootstrapper
    {
        protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
        {
            CookieBasedSessions.Enable(pipelines);
    
            // Replace UserToStateMap with your class of choice
            container.Register<IUserToStateMap, UserToStateMap>();
    
            GlobalHost.DependencyResolver = new TinyIoCDependencyResolver(container);
            RouteTable.Routes.MapHubs();
        }
    }
    
  3. ハブとナンシーモジュールの依存関係としてIUserToStateMapを追加します

    public class MyModule : NancyModule
    {
        public MyModule(IUserToStateMap userToStateMap)
        {
            Get["/"] = o =>
            {
                var userId = Session["userId"];
                var state = userToStateMap[userId];
                return state.Foo;
            };
        }
    }
    
    public class MyHub : Hub
    {
        private readonly IUserToStateMap m_UserToStateMap;
    
        public MyHub(IUserToStateMap userToStateMap)
        {
            m_UserToStateMap = userToStateMap;
        }
    
        public string MySignalrMethod(string userId)
        {
            var state = userToStateMap[userId];
            return state.Bar;
        }
    }
    

私が本当に望んでいるのは、接続IDなどに基づいて2つの間で状態を簡単に共有する方法ですが、それまでの間、このソリューションは私にとってはうまくいきます。

于 2012-12-17T10:02:57.060 に答える