ASP.. NET Web Api依赖注入——是否为单例

本文关键字:是否 单例 注入 依赖 NET Web Api ASP | 更新日期: 2023-09-27 18:07:56

我正在用asp.net构建一个web api,我正在使用UnityContainer来处理依赖关系。

例如,我的认证控制器可以依赖于认证服务:

class AuthController : ApiController {
    private IAuthService authService;
    public AuthController (IAuthService AuthService) {
        this.authService = AuthService;
    }
    ...
}
我的认证服务的实现可以依赖于我的用户存储库:
class AuthController : IAuthService {
    private IUserRepository userRepository;
    public AuthService (IUserRepository UserRepository) {
        this.userRepository = UserRepository;
    }
    ...
}

现在,我知道unity有两种方式来处理依赖,它可以在每次需要的时候创建一个新的依赖实例,或者它可以将依赖的实例保存为一个单例,并在每次需要依赖的时候注入同一个单例。

默认情况下,unity采用第一种方法(每次创建一个新实例)。

我的问题是:我应该保持这种方式,或者我应该告诉unity保持我的服务和存储库作为单例?

当我的用户存储库依赖于其他依赖项时,这个问题真正出现在我的脑海中,而这个依赖项又依赖于用户存储库。当我试图运行web api时,它抛出了一个堆栈溢出异常,我认为它这样做是因为它必须每次都创建一个用户存储库和另一个存储库的新实例。

谢谢你,Arik

ASP.. NET Web Api依赖注入——是否为单例

为每个HttpRequest创建一组新的实例可能是您想要的。这可以防止在实例中缓存某些内容时出现一些意想不到的副作用,使某些逻辑混乱。如果你把它限定在HttpRequest级别,并且你的依赖链依赖于某个存储库4次,它们都将共享该存储库的相同实例。

这里是你如何在Unity中做到这一点:MVC, EF - DataContext单例实例Per-Web-Request在Unity

不应该对dbcontext使用单例。您可以使用每个httprequest生命周期或每个解析生命周期。要添加每个请求的生命周期,你可以使用nuget包Unity。WebAPI