SignalR多个请求

时间:2013-09-20 13:40:35

标签: asp.net .net signalr

我是论坛的新手,也是编程的“世界”。我在使用SignalR Web技术创建游戏时遇到了一个问题,它表达了对来自UI-a的多个请求访问数据库(使用EF)的问题。使用存储库模式的最佳解决方案是什么?在这个阶段我的决定是在每个访问数据库的方法中添加Lock {}结构。如何避免阻止对服务器的请求?

public interface IRepository<T> where T : class
   {
    IQueryable<T> GetAll();
    T GetById(object id);
    void Add(T item);
    void Update(T item);      
    void Delete(T item);
    void Delete(object id);
  }


  public class DBRepository<T> : IRepository<T> where T : class
{
    private DbContext DbContext;
    private DbSet<T> Entities
    {
        get
        {
            return this.DbContext.Set<T>();
        }
    }

    public DBRepository(DbContext context)
    {
        this.DbContext = context;
    }

    public IQueryable<T> GetAll()
    {
        return Entities.AsQueryable();
    }
 .....

  public class TicTacToeContext : DbContext
{

    public DbSet<Game> Games { get; set; }
    public DbSet<Guess> Guesses { get; set; }
    public DbSet<Message> Messages { get; set; }
    public DbSet<MessageState> MessageStates { get; set; }
    public DbSet<MessageType> MessageTypes { get; set; }
    public DbSet<User> Users { get; set; }

    public TicTacToeContext()
        : base("TicTacToeDb")
    {
    }
 public interface IGameService
{
    void CreateGame(CreateGameModel gameModel);
    void JoinGame(JoinGameModel gameModel);
  ...
 public abstract class BaseService
{

    public IRepository<User> UserRepository;
    public  IRepository<Game> GameRepository;
...
  public class GameService : BaseService, IGameService
{

        public GameService(IRepository<Game> gameRepositort, IRepository<User>            userRepository, ISessionService sessionService)
    {
        this.UserRepository = userRepository;
        this.GameRepository = gameRepositort;

    }

    public void CreateGame(CreateGameModel gameModel)
    {
       ....
    }
  public class TicTacToeHub : Hub
{
    IUserService UserServise;
    IGameService GameServise;
    private static object _syncRoot = new object();
    public TicTacToeHub(IUserService userService, IGameService gameService)
    {
        this.UserServise = userService;
        this.GameServise = gameService;
    }
   .....


    public void ReturnOpenGamesToClient(string sessionKey)
    {
        IEnumerable<GameModel> openGames;
        lock (_syncRoot)
       {
           openGames = GameServise.GetOpenGames(sessionKey).ToList();
       }
        Clients.Caller.updateOpenGamesList(openGames);            
    }

1 个答案:

答案 0 :(得分:0)

为什么锁?您使用数据库并且只更新一个实体(不需要事务范围)。

锁需要用于IList或IDictionary之类的Inmemory类型,否则当一个请求读取而另一个请求写入时它将崩溃。但是SQL会为你解决这个问题