2013-07-20 185 views
0

我正在研究ASP.net Web Api,SignalR,希望将消息发送给所有用户,在更新实体时更新锁定其他用户,但希望避免重复HUB和Web API控制器中的代码。SignalR Generic Hub

我希望泛型代码表示下面的行为,而不是每个实体都有1个实体。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using Microsoft.AspNet.SignalR; 
using Microsoft.AspNet.SignalR.Hubs; 
using SignalRGridDemo.Models; 
using System.Data; 
using System.Collections.Concurrent; 
using System.Threading.Tasks; 

namespace SignalRGridDemo.Hubs { 
    [HubName("employee")] 
    public class EmployeeHub : Hub { 
    private static ConcurrentDictionary<string, List<int>> _mapping = new ConcurrentDictionary<string, List<int>>(); 
    private SignalRGridDemoContext db = new SignalRGridDemoContext(); 

    public override Task OnConnected() { 
     _mapping.TryAdd(Context.ConnectionId, new List<int>()); 
     Clients.All.newConnection(Context.ConnectionId); 
     return base.OnConnected(); 
    } 

    public void Lock(int id) { 
     var employeeToPatch = db.Employees.Find(id); 
     employeeToPatch.Locked = true; 
     db.Entry(employeeToPatch).State = EntityState.Modified; 
     db.SaveChanges(); 
     Clients.Others.lockEmployee(id); 
     _mapping[Context.ConnectionId].Add(id); 
    } 

    public void Unlock(int id) { 
     UnlockHelper(id); 
     _mapping[Context.ConnectionId].Remove(id); 
    } 

    private void UnlockHelper(int id) { 
     var employeeToPatch = db.Employees.Find(id); 
     employeeToPatch.Locked = false; 
     db.Entry(employeeToPatch).State = EntityState.Modified; 
     db.SaveChanges(); 
     Clients.Others.unlockEmployee(id); 
    } 

    public override Task OnDisconnected() { 
     foreach (var id in _mapping[Context.ConnectionId]) { 
     UnlockHelper(id); 
     } 
     var list = new List<int>(); 
     _mapping.TryRemove(Context.ConnectionId, out list); 
     return base.OnDisconnected(); 
    } 
    } 
} 

回答

0

我不认为你需要一个通用集线器,你需要的是一个通用的参数,或者更具体的参数继承了锁定功能

所以你需要的是:

  • 让你的实体继承的ILockable接口,具有锁定\解锁方法
  • 做一个版本的查找\保存方法返回一个ILockable对象
  • 对返回的对象执行锁定功能然后保存它