环境:.netcore3.1 SQLserver
startup服务注入
services.AddSingleton<IUser_UserRoleEntityService, User_UserRoleEntityServicelmpl>();
services.AddSingleton<IUser_UserRoleServer, User_UserRole>();
持久层仓库的注入
services.AddScoped(typeof(IReadRepository<>), typeof(ReadRepository<>));
services.AddScoped(typeof(IReadEntityContext), typeof(ReadEntityContext));
由于持久层使用的是scoped注入,那么我在usecase层也就是【IUser_UserRoleServer】在进行单例注入的时候提示:容器作用域不合法【回家只能用Mac。提示报错信息大概是这个信息。】
如果usercase层改用scoped注入的话那么就代表这每一次请求或者是每一个客户端都会new一个新的实例。
提问:如何使usercase层使用singleton注入,而dbcontext使用scoped注入。。。
单例实例如果依赖 Scoped 实例,Scoped 实例永远无法被 GC 回收,会造成内存泄露。
能这样实现,但是不建议这么做。你得好好考虑为啥你的service一定要singleton,不能scope。
services.AddSingleton<IUser_UserRoleEntityService, User_UserRoleEntityServicelmpl>();
services.AddScoped(typeof(IReadEntityContext), typeof(ReadEntityContext));
class User_UserRoleEntityServicelmpl{
ctor(IServiceProvider sp){
}
CRUD(){
using(var scope = sp.createScope()){
var repo =scope .ServiceProvider.GetService<IReadRepository<Entity>>();
}
}
}
哈哈哈,我知道,因为我也遇到了,内存泄漏应该问题不太存在。
我现在的bll注入方式,是以域的方式配置的。
但是呢,我再搭建定时任务的时候,.net core 是以单例方式创建任务实例的,但是我的定时任务需要使用bll,尴尬的事情就来了