我是一个相当新的.NET,请原谅我的无知,我现在正尝试学习更多.NET Core。
例如,我有一个WebApi控制器中使用的用户服务。将用户服务注册为单例是安全的,还是需要将其注册为作用域?我担心的是,如果多个用户调用同一个端点(例如/ users / me),则它可能会相互返回信息。是这种情况,还是使用单例服务从数据库检索此类数据是否安全?我从http上下文获取用户的ID,并使用userService.FindById(userId)检索数据。我似乎无法从生命周期文档中找到此信息。谢谢
答案 0 :(得分:3)
通常,不,这不是问题。基于简单的描述,没有任何交叉的机会。但是,如果您以某种方式(例如设置ivar)进行某种形式的缓存或以其他方式将用户信息保留在类中,则可能会遇到问题。一般来说,如果除了要注入到构造函数中的任何依赖项之外,否则可以将类设为静态并仍然可以工作,您就可以了。如果您在内部做任何阻止类静态化的事情,那么很有可能会泄漏。
也就是说,如果您的服务依赖于范围内的服务,则应将其本身范围内。使用“用户”服务之类的东西,您很有可能会依赖诸如EF上下文或UserManager<TUser>
之类的东西。这些都是范围内的,因此如果您将服务作为单例,您将被迫采用服务定位器反模式,并且通常也可能会效率低下,这通常是在尝试解决比服务本身寿命短的依赖项。在这种情况下,最好使服务具有范围,允许您直接注入具有范围的依赖项。
似乎有一个天真的想法,对于服务,回购协议等,默认或首选生存期应为单例。实际上,情况恰恰相反:除非有充分明确的理由要这样做,否则您应该首选作用域。例如,如果您尝试使用SemaphoreSlim
之类的方法在线程之间协调一组任务,那么这是一个很明显的情况,需要一个单例寿命。除非您这样做确实需要单身人士生存期,否则请使用作用域生存期。