首页 新闻 会员 周边

.net core 3.1 单例注入 作用域不合法。

0
悬赏园豆:10 [待解决问题]

环境:.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注入。。。

一个挑事的微笑的主页 一个挑事的微笑 | 初学一级 | 园豆:192
提问于:2020-01-20 22:25
< >
分享
所有回答(2)
2

单例实例如果依赖 Scoped 实例,Scoped 实例永远无法被 GC 回收,会造成内存泄露。

dudu | 园豆:30994 (高人七级) | 2020-01-20 22:35
0

能这样实现,但是不建议这么做。你得好好考虑为啥你的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>>();
}

}
}

czd890 | 园豆:14412 (专家六级) | 2020-01-21 10:43

哈哈哈,我知道,因为我也遇到了,内存泄漏应该问题不太存在。

我现在的bll注入方式,是以域的方式配置的。
但是呢,我再搭建定时任务的时候,.net core 是以单例方式创建任务实例的,但是我的定时任务需要使用bll,尴尬的事情就来了

支持(0) 反对(0) 986928835 | 园豆:204 (菜鸟二级) | 2020-03-10 09:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册