Intégration Signalr & Nancyfx

Mon flux app est le suivant (simplifié pour plus de clarté):

  1. L'utilisateur obtient une page de" / page1 "
  2. L'utilisateur effectue des actions sur la page (ajoute du texte, clique, etc..), alors que Signalr communique ces données au serveur, qui effectue de lourds calculs en arrière-plan, et les résultats de ceux-ci sont retournés à la page (appelons ceux "X ).
  3. Lorsque l'utilisateur a terminé avec la page, il clique sur un lien vers "/page2", qui est retourné par Nancy. Cette page est construite en utilisant un modèle qui dépend de X .

alors, comment construire ce modèle basé sur X? Comment signalr peut-il écrire à la session de L'utilisateur D'une manière que Nancy peut comprendre?

(je cherche un moyen" propre")

2
demandé sur seldary 2012-12-11 14:02:25

2 réponses

en attendant l'intégration formelle de Signalr & Nancy, c'est ce que je suis venu avec. Fondamentalement, je partage un conteneur IOC entre les deux, et utilise un objet (singleton lifetime) qui relie les utilisateurs à l'état.

comment partager un conteneur IOC en utilisant le TinyIOC construit:

  1. Étendre Signalr est 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. remplacer signal par défaut DependencyResolver avec notre nouveau

    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. ajouter IUserToStateMap comme une dépendance dans vos hubs et modules 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;
        }
    }
    

ce que je voudrais vraiment, c'est un moyen de partager facilement l'état entre les deux basé sur L'ID de connexion ou quelque chose comme ça, mais en attendant cette solution fonctionne pour moi.

8
répondu seldary 2012-12-17 10:02:57

vous êtes-vous présenté à la recherche d'un exemple simple d'intégration entre Nancy et SignalR? Je sais que j'ai fait.

essayez cette question à la place (je l'ai répondu moi-même).

2
répondu biofractal 2017-05-23 12:04:03