我的应用程序流程如下(为清楚起见进行了简化):
- 用户从“/page1”获取一个页面
- 用户在页面上执行操作(添加文本、点击等),而 Signalr 将此数据传送到服务器,服务器在后台执行大量计算,并将这些结果返回到页面(让我们调用那些“X”)。
- 当用户完成页面时,他单击 Nancy 返回的指向“/page2”的链接。此页面是使用依赖于 X 的模型构建的。
那么,我该如何构建基于 X 的模型? signalr 如何以 Nancy 可以接受的方式写入用户 session ?
(我正在寻找一种“干净”的方式)
最佳答案
在 Signalr 和 Nancy 正式整合之前,这就是我带来的。基本上,我在两者之间共享一个 IOC 容器,并使用一个将用户映射到状态的对象(单例生命周期)。
如何使用内置的 TinyIOC 共享 IOC 容器:
扩展 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)); } }
将 Signalr 的默认 DependencyResolver 替换为我们的新 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(); } }
将 IUserToStateMap 添加为您的 hub 和 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; } }
我真正想要的是一种基于连接 ID 或类似的东西在两者之间轻松共享状态的方法,但与此同时,这个解决方案对我很有效。
关于asp.net - Signalr 和 Nancyfx 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13817794/