2014-07-22 2 views
0

SignalR을 사용하여 데이터를 저장하고 싶습니다. 예 :SignalR을 사용하여 데이터를 저장하는 방법은 무엇입니까?

public void ReservationOpened(long contractId, string username) 
{ 
    // Save the contractId somewhere, that we can access it later. Let's call it ListOfOpenedIds 
    Clients.All.reservationOpened(contractId, username); 
} 

public void ReservationClosed(long contractId) 
{ 
    // look in ListOfOpenIds for contractId, and then remove it. 
    Clients.All.reservationClosed(contractId); 
} 

어떻게하면됩니까? SignalR을 사용하여 Session 사용을 권장하지 않는다고 들었습니다. 그래서 나는 Http.Current.Context.Session을 사용하지 않을 것입니다. Session.

데이터베이스 접근 방식에 대해서는 dbWrite/dbRead를 열거 나 닫을 때마다 사용한다는 사실을 좋아하지 않습니다.

누군가가이를 수행 할 수있는 방법을 말해 줄 수 있습니까? 데이터베이스 접근 방식이 가장 좋은 방법이라면 데이터베이스 연결을 어디에서 초기화해야합니까?

답변

0

이 데이터는 정적 변수에 저장할 수 있습니다. 전역 범위를 가지며 각 사용자별로 고유하지는 않지만 사전을 사용하는 경우 연결 ID를 기반으로 사용자 (세션) 데이터를 조회 할 수 있습니다.

세션 ID를 세션 데이터에 매핑하고 세션 이름을 세션 데이터에 매핑하는 두 개의 사전이있는 세션 관리자 단일 클래스를 사용합니다. 이를 통해 연결 사용자별로 연결 사용자를 식별하고 특정 사용자에게 메시지를 보낼 때 관련 연결 ID를 찾을 수 있습니다.

은 "세션 데이터"클래스 :

public class Player 
{ 
    public Player() 
    { 
     ConnectionIDs = new List<string>(); 
    } 
    public List<string> ConnectionIDs { get; set; } 
    public string Name { get; set; } 
    public string username { get; set; } 
} 

은 "세션 관리자"클래스 :

public class Lobby 
{ 
    private Lobby() 
    { 
     playersByUsername = new Dictionary<string, Player>(); 
     playersByConnectionID = new Dictionary<string, Player>(); 
    } 

    private static Lobby singleton; 
    public static Lobby Get() 
    { 
     if (singleton == null) 
      singleton = new Lobby(); 

     return singleton; 
    } 

    Dictionary<string, Player> playersByUsername; 
    Dictionary<string, Player> playersByConnectionID; 

    public Player GetPlayerByUsername(string username) 
    { 
     if (playersByUsername.ContainsKey(username)) 
      return playersByUsername[username]; 

     return null; 
    } 

    public Player GetPlayerByConnectionID(string connectionID) 
    { 
     if (playersByConnectionID.ContainsKey(connectionID)) 
      return playersByConnectionID[connectionID]; 

     return null; 
    } 

    public void NewPlayer(Player player) 
    { 
     playersByUsername.Add(player.username, player); 
     foreach (string connectionID in player.ConnectionIDs) 
      playersByConnectionID.Add(connectionID, player); 
    } 

    public void NewConnection(string username, string connectionID) 
    { 
     playersByConnectionID.Add(connectionID, playersByUsername[username]); 
     playersByUsername[username].ConnectionIDs.Add(connectionID); 
    } 

} 
관련 문제