ASP.NET Web Api 依赖注入 - 单例与否
ASP.NET Web Api Dependency Injection - Singleton or not
我正在使用 asp.net 构建网络 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 将我的服务和存储库保持为单例?
当我的用户存储库依赖于其他一些依赖项时,我真的想到了这个问题,而该依赖项又依赖于用户存储库。
当我尝试 运行 网络 api 时,它抛出一个堆栈溢出异常,我认为它这样做是因为它每次都必须创建用户存储库和另一个存储库的新实例。
谢谢,
阿里克
为每个 HttpRequest 创建一组新的实例可能是您想要的。如果在实例中缓存了某些内容,这可以防止一些意外的副作用弄乱一些逻辑。如果您将其范围限定在 HttpRequest 级别,并且您的依赖链依赖于某个存储库 4 次不同的时间,它们将共享该存储库的同一个实例。
以下是如何在 Unity 中执行此操作:MVC, EF - DataContext singleton instance Per-Web-Request in Unity
您不应该为 dbcontext 使用单例。您可以使用每个 httprequest 生命周期或每个解析生命周期。要添加每个请求生命周期,您可以使用 nuget 包 Unity.WebAPI
我正在使用 asp.net 构建网络 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 将我的服务和存储库保持为单例?
当我的用户存储库依赖于其他一些依赖项时,我真的想到了这个问题,而该依赖项又依赖于用户存储库。 当我尝试 运行 网络 api 时,它抛出一个堆栈溢出异常,我认为它这样做是因为它每次都必须创建用户存储库和另一个存储库的新实例。
谢谢, 阿里克
为每个 HttpRequest 创建一组新的实例可能是您想要的。如果在实例中缓存了某些内容,这可以防止一些意外的副作用弄乱一些逻辑。如果您将其范围限定在 HttpRequest 级别,并且您的依赖链依赖于某个存储库 4 次不同的时间,它们将共享该存储库的同一个实例。
以下是如何在 Unity 中执行此操作:MVC, EF - DataContext singleton instance Per-Web-Request in Unity
您不应该为 dbcontext 使用单例。您可以使用每个 httprequest 生命周期或每个解析生命周期。要添加每个请求生命周期,您可以使用 nuget 包 Unity.WebAPI