本篇內容主要講解“ASP.NET Core依賴關系注入怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“ASP.NET Core依賴關系注入怎么實現”吧!
面向對象設計(OOD)里有一個重要的思想就是依賴倒置原則(DIP),并由該原則牽引出依賴注入(DI)、控制反轉(IOC)及其容器等老生常談的概念,初學者很容易被這些概念搞暈(包括我在內),在學習Core依賴注入服務之前,下面讓我們先了解下依賴倒置原則(DIP)、依賴注入(DI)、控制反轉(IOC)等概念,然后再深入學習Core依賴注入服務。
高層模塊不依賴于低層模塊的實現,而低層模塊依賴于高層模塊定義的接口。通俗來講,就是高層模塊定義接口,低層模塊負責實現。

當一個類需要另一個類協作來完成工作的時候就產生了依賴。
示例1:
public class MyDependency
{
public MyDependency()
{
}
public Task WriteMessage(string message)
{
Console.WriteLine($"MyDependency.WriteMessage called. Message: {message}");
return Task.FromResult(0);
}
}
public class IndexModel : PageModel
{
MyDependency _dependency = new MyDependency();
public void OnGet()
{
_dependency.WriteMessage("IndexModel.OnGet created this message.");
}
}由上述代碼可以看到IndexModel模塊輸出消息必須要實例化MyDependency模塊,也就是說IndexModel模塊業務的實現必須依賴于MyDependency模塊,這就是依賴。
根據DIP設計原則:高層模塊不依賴于低層模塊的實現,而低層模塊依賴于高層模塊定義的接口,所以我們在這里定義一個接口供高層模塊調用,底層模塊負責實現。
示例2:
public interface IMyDependency
{
Task WriteMessage(string message);
}
public class MyDependency: IMyDependency
{
public MyDependency()
{
}
public Task WriteMessage(string message)
{
Console.WriteLine($"MyDependency.WriteMessage called. Message: {message}");
return Task.FromResult(0);
}
}
public class IndexModel : PageModel
{
IMyDependency _dependency = new MyDependency();
public void OnGet()
{
_dependency.WriteMessage("IndexModel.OnGet created this message.");
}
}從上述代碼可以看到當我們調用IndexModel模塊OnGetAsync方法的時候,是通過IMyDependency接口實例化MyDependency類去實現其方法內容的,這叫控制正轉。但是Master說,我們不應該創建MyDependency類,而是讓調用者給你傳遞,于是你通過構造函數讓外界把這兩個依賴給你。
示例3:
public interface IMyDependency
{
Task WriteMessage(string message);
}
public class MyDependency : IMyDependency
{
private readonly ILogger<MyDependency> _logger;
public MyDependency(ILogger<MyDependency> logger)
{
_logger = logger;
}
public Task WriteMessage(string message)
{
_logger.LogInformation(
"MyDependency.WriteMessage called. Message: {MESSAGE}",
message);
return Task.FromResult(0);
}
}
public class IndexModel : PageModel
{
private readonly IMyDependency _dependency;
public IndexModel(IMyDependency dependency)
{
_dependency = dependency;
}
public void OnGet()
{
_dependency.WriteMessage("IndexModel.OnGet created this message.");
}
}從上述代碼可以看到把依賴的創建丟給第三方系統(例:Autofac,Unity容器),也叫控制反轉(IOC)容器。自己只負責使用,其它人丟給你依賴的這個過程理解為注入。也叫控制反轉(IOC)。注意,框架內部ILogger接口已注入,無需手動再重新注入。
IOC容器可以看作是負責統一管理依賴關系的地方。常見有Autofac,Unity。
容器只要負責兩件事情:
●綁定服務與實例之間的關系
●獲取實例,并對實例進行管理(創建與銷毀)
DIP是一種軟件設計原則,它僅僅告訴你高低層模塊之間應該如何依賴,但是它并沒有告訴我們如何解除相互依賴模塊的耦合。而IOC則是一種軟件設計模式,它告訴我們該如何解除模塊的耦合,它為相互依賴的組件提供抽象,將依賴(低層模塊)對象的獲得交給第三方系統(例:Autofac,Unity容器)來控制,即依賴對象不在被依賴模塊的類中直接通過new來獲取。
經過上面描述,大家應該應該對依賴倒置原則(DIP)、依賴注入(DI)、控制反轉(IOC)這幾個概念有一定了解對吧。在.NET Core中DI的核心分為兩個組件:IServiceCollection和 IServiceProvider。
IServiceCollection負責注冊
IServiceProvider負責提供實例
下面讓我們來學習下NET Core是怎么依賴注入(DI)服務。
第一步:使用接口來實現依賴反轉。定義 IMyDependency 服務。
public interface IMyDependency
{
Task WriteMessage(string message);
}第二步:定義IMyDependency 服務的實現類MyDependency。
public class MyDependency : IMyDependency
{
private readonly ILogger<MyDependency> _logger;
public MyDependency(ILogger<MyDependency> logger)
{
_logger = logger;
}
public Task WriteMessage(string message)
{
_logger.LogInformation(
"MyDependency.WriteMessage called. Message: {MESSAGE}",
message);
return Task.FromResult(0);
}
}第三步:把IMyDependency 服務注冊到服務容器中。
public void ConfigureServices(IServiceCollection services)
{
//注冊將服務生命期的范圍限定為單個請求的生命期,下節再來聊服務生命期
services.AddScoped<IMyDependency, MyDependency>();
}第四步:把服務注入到使用它的類的構造函數中。在HomeController里面調用IndexModel.OnGet方法輸出WriteMessage消息。
public class IndexModel : PageModel
{
private readonly IMyDependency _dependency;
public IndexModel(IMyDependency dependency)
{
_dependency = dependency;
}
public void OnGet()
{
_dependency.WriteMessage("IndexModel.OnGet created this message.");
}
}
private readonly IMyDependency _iMyDependency;
public HomeController(IMyDependency iMyDependency)
{
_iMyDependency = iMyDependency;
}
public IActionResult Index()
{
IndexModel _IndexModel = new IndexModel(_iMyDependency);
_IndexModel.OnGet();
return View();
}WriteMessage日志消息如下:

下面我們將來演示內置容器怎么替換為其他容器示例,比如替換第三方 Autofac容器,我們需要在Startup.ConfigureServices方法里面注冊Autofac容器,具體代碼如下:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// Add Autofac
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterModule<DefaultModule>();
containerBuilder.Populate(services);
var container = containerBuilder.Build();
return new AutofacServiceProvider(container);
}這里需要注意的是如果需要使用第三方容器,Startup.ConfigureServices 必須返回 IServiceProvider。然后自定義一個模塊類配置依賴關系,具體代碼如下:
public class DefaultModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<CharacterRepository>().As<ICharacterRepository>();
}
}應用程序在運行時,使用 Autofac 來解析類型,并注入依賴關系。
到此,相信大家對“ASP.NET Core依賴關系注入怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。