Я создаю игровой сервер с помощью консольного приложения dotnet core 2.2, у меня есть некоторое недопонимание о том, как работает структура сущностей в определенных senarios.Я хочу хранить пользовательскую информацию в памяти, но с учетом двух важных факторов.
- Я хочу, чтобы данные постоянно обновлялись
- Я хочу сделать минимальное количество запросов к базе данных
Вот способВ настоящее время я делаю это:
DatabaseManager.cs
internal static class DatabaseManager
{
public static async Task<User> FindUser(int userId, string token)
{
using (var dbContext = new musicContext())
{
return await dbContext.User.FirstOrDefaultAsync(u =>
u.UserId == userId && string.Equals(u.Token, token, StringComparison.InvariantCulture));
}
}
public static IEnumerable<Game> GetUserGames(User user)
{
using (var dbContext = new musicContext())
{
return dbContext.Game
.Include(g => g.ParticipantOneNavigation)
.Include(g => g.ParticipantTwoNavigation)
.Where(g =>
g.ParticipantOneNavigation == user || g.ParticipantTwoNavigation == user);
}
}
}
Player.cs
internal class Player : IEquatable<Player>
{
private readonly NetPeer _netPeer;
private User _user;
private int _userId;
private string _token;
public Player(NetPeer netPeer)
{
_netPeer = netPeer;
}
public async Task<bool> Authenticate(int userId, string token)
{
_user = await DatabaseManager.FindUser(userId, token);
if (_user is null)
return false;
_userId = userId;
_token = token;
return true;
}
public NetPeer GetPeer()
{
return _netPeer;
}
public int GetPlayerId()
{
FlushData();
return _user.UserId;
}
public string GetUsername()
{
FlushData();
return _user.Username;
}
public string GetNickname()
{
FlushData();
return _user.Nickname;
}
public string GetPhoneNumber()
{
FlushData();
return _user.PhoneNumber;
}
public int GetCoins()
{
FlushData();
return _user.Coins;
}
public int GetCups()
{
FlushData();
return _user.Cups;
}
public bool IsAuthenticated()
{
return _user != null;
}
public bool IsSuspended(out DateTimeOffset suspendedUntil)
{
suspendedUntil = _user.SuspendedUntil.GetValueOrDefault();
return _user.Suspended;
}
public bool Equals(Player other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return _playerId == other._playerId;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
return obj.GetType() == GetType() && Equals((Player)obj);
}
public override int GetHashCode()
{
return _playerId;
}
private async void FlushData()
{
_user = await DatabaseManager.FindUser(_userId, _token);
}
}
Isэто оптимальный способ сделать это?Если нет, что вы можете предложить, чтобы сделать его лучше?