У меня есть служба, работающая на сервере, который прослушивает очередь сообщений. Когда сообщение получено, запускается новый поток, и сообщение передается этому потоку для обработки.
Я определил интерфейс, который предоставляет доступ текущему пользователю для использования в различных классах, используемых для обработки сообщений:
public interface IUserContext {
User CurrentUser { get; }
}
Скорее всего, этот пользователь будет меняться от сообщения к сообщению.
Мой вопрос заключается в том, как зарегистрировать реализацию IUserContext в SimpleInjector, чтобы правильный пользователь, содержащийся во входящем сообщении, правильно возвращался свойством CurrentUser?
В моем приложении Asp.Net это было выполнено следующим образом:
container.Register<IUserContext>(() => {
User user = null;
try {
user = HttpContext.Current?.Session[USER_CONTEXT] as IUser;
}
catch { }
return new UserContext(user);
});
Я бы предположил, что это будет достигнуто с помощью Lifetime Scoping, но я не могу определить это в статическом классе и установить пользователя в каждом потоке, потому что это может повредить другой процесс. Это мое лучшее предположение о реализации?
public static Func<User> UserContext { get; set; }
Затем в моем коде в новом потоке:
using (container.BeginLifetimeScope()) {
.....
var user = GetUserContext(message);
UserContextInitializer.UserContext = () => new UserContext(user);
.....
}
Тогда регистрация будет выглядеть примерно так:
container.Register<IUserContext>(() => UserContextInitializer.UserContext);
Помимо безопасности потоков, это правильный подход к реализации этого в SimpleInjector? Есть ли другой шаблон, который был бы более правильным?
UserContext
? - person Robert Harvey   schedule 22.04.2019UserContext
содержит полезное состояние. Возможно, неизменяемая реализация? - person Robert Harvey   schedule 22.04.2019