信号员和Nancyfx整合

时间:2012-12-11 10:02:26

标签: asp.net .net session signalr nancy

我的应用流程如下(为简洁起见而简化):

  1. 用户从" / page1"获取页面
  2. 用户在页面上执行操作(添加文本,点击等等),而Signalr将此数据传送到服务器,服务器在后台执行大量计算,并将结果返回到页面(让我们调用那些" X" )。
  3. 当用户完成页面后,他点击了Nancy返回的" / page2"的链接。此页面使用依赖于 X Model 构建。
  4. 那么,我如何基于X构建该模型?信号器如何以Nancy可以接收的方式写入用户会话?

    (我正在寻找"干净"方式)

2 个答案:

答案 0 :(得分:8)

正在进行Signalr&amp ;;的正式整合。南希,这就是我的意思。基本上,我在两者之间共享一个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添加为集线器和Nancy模块中的依赖项

    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;
        }
    }
    
  4. 我真正想要的是一种基于连接ID或类似内容在两者之间轻松共享状态的方法,但同时这个解决方案适合我。

答案 1 :(得分:2)

您是否听说过寻找如何整合Nancy和SignalR的简单示例?我知道我做了。

请尝试这个问题(我自己回答)。