我有一个在服务器上运行的服务,它侦听消息队列。收到消息时,将启动一个新线程并将消息传递给该线程进行处理。
我已经定义了一个接口,它提供对当前用户的访问,以便在用于消息处理的各种类中使用:
public interface IUserContext {
User CurrentUser { get; }
}
该用户可能会从消息更改为消息。
我的问题是如何在 SimpleInjector 中注册 IUserContext 的实现,以便 CurrentUser 属性正确返回传入消息中包含的正确用户?
在我的 Asp.Net 应用程序中,这是通过以下方式完成的:
container.Register<IUserContext>(() => {
User user = null;
try {
user = HttpContext.Current?.Session[USER_CONTEXT] as IUser;
}
catch { }
return new UserContext(user);
});
我想这将使用生命周期范围来完成,但我不能在静态类中定义它并在每个线程中设置用户,因为它可能会破坏另一个进程。这是我对实施的最佳猜测?
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 中实现它的正确方法吗?还有另一种模式会更正确吗?
慕村9548890
相关分类