ตัวอย่างการใช้แกน Asp.net
ลิงก์วิดีโอที่บันทึกไว้: https://www.youtube.com/watch?v=oVj1IHw8GLU
ภาพรวมของ DI: https://github.com/sandeepmvn/DependencyInjectionRepository/blob/master/OverviewOfDI.txt
ASP.NET Core รองรับรูปแบบการออกแบบซอฟต์แวร์ dependency injection (DI) ซึ่งเป็นเทคนิคในการบรรลุ Inversion of Control (IoC) ระหว่างคลาสและการขึ้นต่อกัน
เราสามารถทำได้ผ่านคอนเทนเนอร์ IoC
ในแกน Asp.net นั้น IoC Container มีอินเทอร์เฟซในตัว
วงจรการใช้งาน DI ต่อไปนี้จะเป็น
โดยทั่วไปมีบริการสองประเภทใน ASP.NET Core:
Framework Services: บริการที่เป็นส่วนหนึ่งของ ASP.NET Core framework เช่น IApplicationBuilder, IHostingEnvironment, ILoggerFactory เป็นต้น
บริการแอปพลิเคชัน: บริการ (ประเภทหรือคลาสที่กำหนดเอง) ที่คุณในฐานะโปรแกรมเมอร์สร้างขึ้นสำหรับแอปพลิเคชันของคุณ
คอนโทรลเลอร์ Asp.Net Core MVC ร้องขอการพึ่งพาอย่างชัดเจนผ่านตัวสร้าง 1. การแทรกตัวสร้าง 2. วิธีการฉีด (ระดับการกระทำ) 3. การแทรก Propery (ไม่รองรับ) 4. การแทรกมุมมอง
ตัวสร้างการฉีด: - บริการจะถูกเพิ่มเป็นพารามิเตอร์ตัวสร้างและรันไทม์แก้ไขบริการจากคอนเทนเนอร์บริการ (IServiceCollection-- DiContainer) โดยทั่วไป Servicesa จะถูกกำหนดโดยใช้คลาสที่ไม่เป็นรูปธรรม (อินเทอร์เฟซ)
วิธีการแทรก : - การใช้แอตทริบิวต์ [FromService] ช่วยให้สามารถแทรกบริการลงในวิธีดำเนินการได้โดยตรงโดยไม่ต้องใช้ตัวควบคุมการฉีด
การฉีดคุณสมบัติในปัจจุบัน (แกน Asp.net) คอนเทนเนอร์ IOC แบบหัวกระสุนไม่รองรับการฉีดคุณสมบัติ สำหรับสิ่งนี้ คุณอาจเลือกใช้คอนเทนเนอร์บริการในตัว (IOC) ของบุคคลที่สาม
ดูการฉีดโดยใช้คำสั่ง [ฉีด] ช่วยให้สามารถฉีดบริการลงในหน้ามุมมองได้โดยตรงโดยไม่ต้องใช้ตัวควบคุมหรือวิธีการฉีด
คอนเทนเนอร์ 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}");
}
}
ตอนนี้ลงทะเบียนบริการ "IMyDependency" ด้วยประเภทที่เป็นรูปธรรม "MyDependency" (ใน startup.cs)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.Add(new ServiceDescriptor(typeof(IMyDependency), new MyDependency()));
}
}
ที่นี่ใช้เมธอด Add() ของอินสแตนซ์ "IServiceCollection" เพื่อลงทะเบียนบริการกับคอนเทนเนอร์ IoC "ServiceDescriptor" ใช้เพื่อระบุประเภทของบริการและการใช้งานที่เป็นรูปธรรม สิ่งนี้จะลงทะเบียนบริการของเราในคอนเทนเนอร์โดยมีค่าเริ่มต้นเป็น "ซิงเกิลตัน"
ทีนี้มาฉีดบริการที่มีช่วงชีวิตที่แตกต่างกันกันดีกว่า
Singleton (กรณีการใช้งาน : เมื่อเราต้องการสร้างบริการของรัฐ) :
services.Add (ServiceDescriptor ใหม่ (ประเภท (IMyDependency), MyDependency ใหม่ (), ServiceLifetime.Singleton));
ชั่วคราว (กรณีการใช้งาน : เมื่อเราต้องการสร้างบริการไร้สัญชาติ):
services.Add (ServiceDescriptor ใหม่ (ประเภท (IMyDependency), MyDependency ใหม่ (), ServiceLifetime.Transient));
กำหนดขอบเขต (กรณีการใช้งาน : บริการฐานข้อมูล):
services.Add (ServiceDescriptor ใหม่ (ประเภท (IMyDependency), MyDependency ใหม่ (), ServiceLifetime.Scoped));
นอกจากนี้เรายังสามารถฉีดบริการโดยใช้วิธีการขยายแบบ bulit-in
ซิงเกิลตัน
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();
}
-