У меня есть служба, работающая на сервере, который прослушивает очередь сообщений.Когда сообщение получено, запускается новый поток, и сообщение передается этому потоку для обработки.
Я определил интерфейс, который предоставляет доступ текущему пользователю для использования в различных классах, используемых для обработки сообщения:
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);
Thread Safety aside, Это правильный подход для реализации этого в SimpleInjector?Есть ли другой шаблон, который был бы более правильным?