Насколько я понимаю, вам нужно будет выполнить запрос для каждого пользователя, но вы не хотите делать это блокирующим вызовом.Вы хотите отзывчивость денормализованной модели чтения, UserData.
У меня есть идея, что вместо того, чтобы где-то хранить учетные данные, вы просто запускаете поток и предоставляете этому потоку текущие учетные данные, взятые из запроса.
class MyClass
{
public static void DoSomething(object principal)
{
if (principal == null || !(principal is IPrincipal))
throw new ArgumentException();
Thread.CurrentPrincipal = (IPrincipal) principal;
// Do heavy querying and update UserData
}
}
Я вызываю это из контроллера ASP.NET MVC следующим образом:
public ActionResult Index()
{
var t = new Thread(MyClass.DoSomething);
t.Start(User);
return View();
}
Это обновит данные пользователя для каждого запроса.При желании вы можете ввести некоторую логику для частоты обновления и выполнять вызов только при определенных условиях.
Другим подходом, о котором я думал, был шаг к мышлению CQRS, где я в этом случае опубликовал бы сообщение, содержащее сериализованный IPrincipal
, и это сообщение было бы использовано другим экземпляром / сервером, который обновитчитать модель как отдельный процесс.Но я не уверен, что IPrincipal
будет действительно работать, если десериализовать на другом сервере.
В любом случае, я не вижу преимущества сохранения учетных данных.Просто используйте их в рамках нового потока или в контексте использованного сообщения.