使用 Asp.net core 的範例
錄製影片連結:https://www.youtube.com/watch?v=oVj1IHw8GLU
OverviewOfDI:https://github.com/sandeepmvn/DependencyInjectionRepository/blob/master/OverviewOfDI.txt
ASP.NET Core 支援依賴注入 (DI) 軟體設計模式,這是一種在類別及其相依性之間實現控制反轉 (IoC) 的技術。
透過IoC容器,我們可以實現
在Asp.net core中,IoC容器有內建的介面。
以下 DI 生命週期將是
ASP.NET Core 中基本上有兩種類型的服務:
框架服務:屬於 ASP.NET Core 框架一部分的服務,例如 IApplicationBuilder、IHostingEnvironment、ILoggerFactory 等。
應用程式服務:您作為程式設計師為應用程式建立的服務(自訂類型或類別)。
Asp.Net Core MVC 控制器透過建構函式明確請求依賴項 1. 建構函式註入 2. 方法注入(操作層級) 3. 屬性注入(不支援) 4. 視圖注入
建構子注入: - 服務作為建構子參數添加,運行時從服務容器(IServiceCollection - DiContainer)解析服務。服務a通常使用非特定類別(介面)來定義
方法注入: - 使用 [FromService] 屬性可以將服務直接注入到操作方法中,而無需使用控制器注入
屬性注入 目前(Asp.net core)內建 IOC 容器不支援屬性注入。
視圖注入使用 [Inject] 指令可以將服務直接注入視圖頁面,而無需使用控制器或方法注入
內建的IoC容器支援三種生命週期:
在範例中,「IMyDependency」服務介面定義了「WriteMessage」方法
public interface IMyDependency
{
void WriteMessage(string message);
}
此介面由具體類型 MyDependency 實作:
public class MyDependency : IMyDependency
{
public void WriteMessage(string message)
{
Console.WriteLine($"MyDependency.WriteMessage Message: {message}");
}
}
現在,使用具體類型「MyDependency」註冊「IMyDependency」服務(在startup.cs中)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency()));
}
}
這裡「IServiceCollection」實例的 Add() 方法用於向 IoC 容器註冊服務。 「ServiceDescriptor」用於指定服務的類型和具體實作。這將在容器中註冊我們的服務,預設為“Singleton”
現在,讓我們注入不同生命週期的服務
Singleton(用例:當我們需要建立狀態服務時):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Singleton));
瞬態(用例:當我們需要建立無狀態服務時):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Transient));
範圍(用例:資料庫服務):
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency(),ServiceLifetime.Scoped));
我們還可以使用內建擴充方法注入服務
辛格頓
services.AddSingleton
瞬態
services.AddTransisent
範圍
services.AddScoped
公用類別 HomeController : 控制器 { 私人唯讀 IMyDependency _service;
public HomeController(IMyDependency service)
{
_service = service;
}
public IActionResult Index()
{
_service.WriteMessage("Constructor level injection")
return View();
}
}
public class HomeController : Controller
{
//Fromservice attribute
public IActionResult Index([FromService]IMyDependency service)
{
service.WriteMessage("Action level injection")
return View();
}
}
公共類別 HomeController : 控制器 {
public IActionResult Index()
{
return View();
}
}
在 Index.cshtml 中
@{ ViewData["標題"] = "首頁"; }
//using Inject directive
@inject IMyDependency service
//code block
@{
service.WriteMessage("View level Injection");
}
公共類別 HomeController : 控制器 {
public IActionResult Index()
{
var services = this.HttpContext.RequestServices;
var dependencyservice = (IMyDependency)services.GetService(typeof(IMyDependency));
dependencyservice.WriteMessage("without injection, accessing dependent services");
return View();
}
}