У меня есть ASP .Net Core 1.1 Web Api, который обслуживает запросы от внешнего веб-приложения и телефонного приложения. Приложение предназначено для агентов по недвижимости для проведения проверок недвижимости. Таким образом, в системе есть объекты, такие как инспекции, свойства, пользователи, агентства и т. д. Пользователи (т. е. агенты по недвижимости) и свойства принадлежат агентствам. Таким образом, агентство недвижимости может иметь одного или нескольких пользователей и одно или несколько свойств.
Например, пользователь может захотеть просмотреть список всех свойств, проверенных кем-либо из его агентства недвижимости. В этом случае он щелкает где-нибудь в веб-приложении/телефонном приложении, и приложение отправляет HTTP-запрос GET в API для получения списка свойств. Веб-API при получении этого запроса сначала проверяет, какой пользователь это запрашивает, а затем проверяет, к какому агентству принадлежит этот пользователь, а затем возвращает все свойства, которые принадлежат этому агентству. Итак... это [упрощенные] модели, которые у меня есть:
[Table("agency")]
public class Agency
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("agency_id")]
public int? Id { get; set; }
[Column("name")]
public string Name { get; set; }
}
[Table("user")]
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("user_id")]
public int? Id { get; set; }
[Column("username")]
public string Username { get; set; }
[Column("agency_id")]
public int AgencyId { get; set; }
[ForeignKey("AgencyId")]
public Agency Agency { get; set; }
}
[Table("property")]
public class Property
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("property_id")]
public int? Id { get; set; }
[Column("address")]
public string Address { get; set; }
[Column("agency_id")]
public int AgencyId { get; set; }
[ForeignKey("AgencyId")]
public Agency Agency { get; set; }
}
Действие контроллера в веб-API, которое обрабатывает вышеупомянутый запрос, выглядит следующим образом:
[Authorize]
[HttpGet]
public async Task<IActionResult> GetProperties()
{
// Get Auth0 identifier for the user performing the request
string nameIdentifier = User.Claims.FirstOrDefault(c => c.Type == System.Security.Claims.ClaimTypes.NameIdentifier)?.Value;
// Retrieve this user from the database
User user = await _context.User.SingleOrDefaultAsync(u => u.Username == nameIdentifier);
// Return a list of properties that belong to the user's agency
return Ok(_context.Properties
.Where(p.AgencyId == user.AgencyId));
}
Теперь все запросы GET к API фильтруются следующим образом: API возвращает записи, относящиеся к агентству вошедшего в систему пользователя. Независимо от того, запрашивает ли пользователь список проверок, арендодателей или арендаторов, API всегда возвращает только записи, принадлежащие агентству пользователя.
Теперь я знаю, что ASP .Net Core не имеет состояния, поэтому я не могу сохранить объект пользователя на сервере, когда пользователь входит в систему, и иметь его в памяти, готовым для вызова в каждом действии контроллера. Но я чувствую, что этот круговой обход базы данных КАЖДЫЙ раз, когда API получает любой запрос GET, чтобы узнать, к какому агентству принадлежит этот пользователь, является расточительным. Есть лучший способ это сделать? Я довольно новичок в ASP и веб-разработке в целом. Буду очень признателен за любые идеи/подсказки/указатели.