.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 

這樣就比較方便了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM