2013-07-20 5 views
0

Я работаю над ASP.net Web Api, SignalR, хочу отправить сообщение всем пользователям. Заблокируйте других пользователей при обновлении, когда сущность обновлена, но хотите избежать дублирования кода в HUB и Web API Controller.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 интерфейс, с замком \ методами разблокировки
  • Сделать версию Find \ методов Save, возвращающих ILockable объект
  • Сделайте функцию блокировки на возвращенном объекте, а затем сохраните его
Смежные вопросы