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

なぜロックするのですか?DB を使用し、1 つのエンティティのみを更新します (トランザクション スコープは必要ありません)。

ロックは、IList や IDictionary などのインメモリ型に使用する必要があります。そうしないと、ある要求が読み取り、別の要求が書き込みを行うときにクラッシュします。ただし、SQL がこれを処理します。

于 2013-09-20T13:57:17.443 に答える