打赏

.net core 手动获取注入对象

 

控制器相关中:HttpContext来获取实例

HttpContext下有一个RequestedService同样可以用来获取实例对象

IUserDAL userDAL = HttpContext.RequestServices.GetService(typeof(IUserDAL)) as IUserDAL;

 

方法二:使用静态类来获取依赖注入对象

新增加一个类(注意不是内部类不然都不好直接获取了):

public static class ServiceLocator
{
   public static IServiceProvider Instance { get; set; }
}

 

然后在Configure中去赋值一下即可:

使用的时候就可以直接用了

ConfigureServices中

有时间我们可以会做一点初始化的操作,需要在这里获取

var provider = services.BuildServiceProvider();
IArticleDAL userDAL = provider.GetService<IArticleDAL>();

 

注意:如果这里你用了ef,并且ef用了依赖注入获取,在ConfigureServices中获取时需要放到ef配置下面

 

Configure中

IArticleDAL articleDAL = app.ApplicationServices.GetService(typeof(IArticleDAL)) as IArticleDAL;

 

注意如果你需要获取的对象里边依赖的对象使用了Scope方式注入这样获取会报错:

Cannot resolve 'XX.IArticleDAL' from root provider because it requires scoped service 'XX.CNBLOGContext'.

 

需要这样获取

//手动获取依赖注入对象
IServiceScope serviceScope = app.ApplicationServices.CreateScope();
IArticleDAL articleDAL2 = serviceScope.ServiceProvider.GetService<IArticleDAL>();

 但是:

 能通过 CreateScope 来正常 获取使用,为什么要用AddScope的方式注入?(反问)

使用 AddScope 为了解决当前请求的生命周期内一些特殊的对象,下面介绍不使用 CreateScope ,而在当前上下文中来获取 实例

1.在configure里面将当前 HttpContextAccessor 保存下来,具体怎么保存的我没有写,你可以创建个类,用里面的静态私有变量去保存

var serviceProvider = app.ApplicationServices;
var httpContextAccessor = serviceProvider.GetRequiredService<IHttpContextAccessor>();

2.调用

httpContextAccessor.HttpContext.RequestServices.GetService<IBaseservice>();

 

View页面中:

view页面中也可以使用@context拿到httpconext对象

@Context.RequestServices.GetService(typeof(TNBLOG.Main.DAL.Interface.IBlogSetDAL))

 

当然在view中最好使用@inject 

这样就比较方便了

 

posted @ 2020-11-11 15:52  Bear.Tirisfal  阅读(3242)  评论(0编辑  收藏  举报