ASP.NET Core tiêm đối tượng của các lớp dependency thông qua constructor hoặc method bằng cách sử dụng container IoC tích hợp.
Container tích hợp được biểu diễn bằng implementation của IServiceProvider hỗ trợ constructor injection theo mặc định. Các kiểu (lớp) được quản lý bởi container IoC tích hợp được gọi là services.
Để container IoC tự động tiêm các dịch vụ ứng dụng của chúng ta, trước tiên chúng ta cần đăng ký chúng với container IoC.
Ví dụ
public interface ILog {
void Info(string str);
}
class MyConsoleLogger : ILog {
public void Info(string str) {
Console.WriteLine(str);
}
}
ASP.NET Core cho phép chúng ta đăng ký các dịch vụ ứng dụng với container IoC trong phương thức ConfigureServices của lớp Startup. Phương thức ConfigureServices bao gồm tham số kiểu IServiceCollection được sử dụng để đăng ký các dịch vụ ứng dụng.
Đăng ký ILog với container IoC trong phương thức ConfigureServices() như dưới đây:
public class Startup {
public void ConfigureServices(IServiceCollection services) {
services.AddSingleton<ILog, MyConsoleLogger>();
}
}
Phương thức Add() của instance IServiceCollection được sử dụng để đăng ký dịch vụ với container IoC.
Chúng ta đã chỉ định ILog là kiểu dịch vụ và MyConsoleLogger là instance của nó. Điều này sẽ đăng ký dịch vụ ILog như một singleton. Bây giờ, container IoC sẽ tạo object singleton của lớp MyConsoleLogger và tiêm nó vào constructor của các lớp bất cứ nơi nào chúng ta bao gồm ILog như tham số constructor hoặc method trong toàn bộ ứng dụng.
Các hình thức Dependency Injection
ASP.NET Core hỗ trợ ba hình thức tiêm dependency chính:
- Constructor Injection: Phổ biến nhất, tiêm qua constructor của class
- Method Injection: Tiêm qua tham số của action method
- Property Injection: Tiêm qua property (ít sử dụng hơn)
Ví dụ Constructor Injection trong Controller
public class HomeController : Controller {
private readonly ILog _logger;
// Constructor Injection
public HomeController(ILog logger) {
_logger = logger;
}
public IActionResult Index() {
_logger.Info("Home page accessed");
return View();
}
}