@manhng

Welcome to my blog!

Dependency Injection in .NET Core

July 16, 2018 22:58

Dependency Injection in .NET Core (edit)

Document

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1#service-lifetimes-and-registration-options

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  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)

  • Scopedlifetime services được tạo cho mỗi request.

  • Singletonlifetime 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();
    }
}

Categories

Recent posts