Dependency Injection in .NET Core (edit)
Document
https://nhatkyhoctap.blogspot.com/2017/08/dependency-injection-trong-net-core.html
https://www.slideshare.net/HunBinh/gii-thiu-aspnet-core-20
Interface
public interface IDrinkBuyer { void BuyDrink(string name); }
Implementation
public class CircleKDrinkBuyer : IDrinkBuyer { public void BuyDrink(string name) { // Go to circle k // Find the -name- drink // Buy it and deliver } } public class VinmartDrinkBuyer : IDrinkBuyer { public void BuyDrink(string name) { // Go to Vinmart // Find the -name- drink // Buy it and deliver } }
Register
public void ConfigureServices(IServiceCollection services) { // Add my services services.AddScoped<IDrinkBuyer, CircleKDrinkBuyer>(); // Add framework services. services.AddMvc(); }
Lifetime
Có 3 loại lifetime:
- Transient: mỗi lần gọi tới nó sẽ là 1 biến thể mới hoàn toàn (cái này chỉ phù hợp cho các loại service siêu nhẹ và không lưu trữ trạng thái)
-
Scoped: Trong cùng 1 request, nó sẽ chỉ được tạo 1 lần duy nhất
-
Singleton: Nó sẽ được tạo lần đầu tiên khi được gọi, và sẽ sống mãi cho tới khi app chết.
Có 3 loại lifetime cho một service trong asp.net, là Transient, Scoped và Singleton
-
Transient: lifetime services được tạo ra mỗi lần nó được gọi (loại này phù hợp cho các service lightweight, stateless)
-
Scoped: lifetime services được tạo cho mỗi request.
-
Singleton: lifetime services được tạo cho lần requested đầu tiên, hoặc khi ConfigureServices khởi chạy, nếu bạn có tạo 1 instance của service trong đó rồi thì các request sau đó sẽ xài lại instance này.
Constructor Injection
private readonly IDrinkBuyer _drinkBuyer public HomeController(IDrinkBuyer drinkBuyer) { _drinkBuyer = drinkBuyer; }
Action Injection
public IActionResult About([FromServices] IDrinkBuyer drinkBuyer) { drinkBuyer.BuyDrink("coca"); return View(); }
Service in Service
public interface ITransport { void Transport(); } public class BikeTransport : ITransport { public void Transport() { // transport by bike } } public class CarTransport : ITransport { public void Transport() { // transport by car } }
Register
services.AddScoped<ITransport, BikeTransport>();
Implementation
public class CircleKDrinkBuyer : IDrinkBuyer { private readonly ITransport _transport; public CircleKDrinkBuyer(ITransport transport) { _transport = transport; } public void BuyDrink(string name) { // Go to circle k // Find the -name- drink // Buy it // Deliver _transport.Transport(); } }