我的应用流程如下(为简洁起见而简化):
那么,我如何基于X构建该模型?信号器如何以Nancy可以接收的方式写入用户会话?
(我正在寻找"干净"方式)
答案 0 :(得分:8)
正在进行Signalr&amp ;;的正式整合。南希,这就是我的意思。基本上,我在两者之间共享一个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替换为新的
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添加为集线器和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或类似内容在两者之间轻松共享状态的方法,但同时这个解决方案适合我。
答案 1 :(得分:2)
您是否听说过寻找如何整合Nancy和SignalR的简单示例?我知道我做了。
请尝试这个问题(我自己回答)。