1

我是论坛和编程“世界”的新手。我在使用 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);            
    }
4

1 回答 1

0

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

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

于 2013-09-20T13:57:17.443 回答