AddTransient, AddScoped and AddSingleton Services Differences

后端 未结 8 1802
时光取名叫无心
时光取名叫无心 2020-11-22 13:36

I want to implement dependency injection (DI) in ASP.NET Core. So after adding this code to ConfigureServices method, both ways work.<

8条回答
  •  孤城傲影
    2020-11-22 13:55

    After looking for an answer for this question I found a brilliant explanation with an example that I would like to share with you.

    You can watch a video that demonstrate the differences HERE

    In this example we have this given code:

    public interface IEmployeeRepository
    {
        IEnumerable GetAllEmployees();
        Employee Add(Employee employee);
    }
    
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    
    public class MockEmployeeRepository : IEmployeeRepository
    {
        private List _employeeList;
    
        public MockEmployeeRepository()
        {
            _employeeList = new List()
        {
            new Employee() { Id = 1, Name = "Mary" },
            new Employee() { Id = 2, Name = "John" },
            new Employee() { Id = 3, Name = "Sam" },
        };
        }
    
        public Employee Add(Employee employee)
        {
            employee.Id = _employeeList.Max(e => e.Id) + 1;
            _employeeList.Add(employee);
            return employee;
        }
    
        public IEnumerable GetAllEmployees()
        {
            return _employeeList;
        }
    }
    

    HomeController

    public class HomeController : Controller
    {
        private IEmployeeRepository _employeeRepository;
    
        public HomeController(IEmployeeRepository employeeRepository)
        {
            _employeeRepository = employeeRepository;
        }
    
        [HttpGet]
        public ViewResult Create()
        {
            return View();
        }
    
        [HttpPost]
        public IActionResult Create(Employee employee)
        {
            if (ModelState.IsValid)
            {
                Employee newEmployee = _employeeRepository.Add(employee);
            }
    
            return View();
        }
    }
    

    Create View

    @model Employee
    @inject IEmployeeRepository empRepository
    
    
    Total Employees Count = @empRepository.GetAllEmployees().Count().ToString()

    Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddSingleton();
    }
    

    Copy-paste this code and press on the create button in the view and switch between AddSingleton , AddScoped and AddTransient you will get each time a different result that will might help you understand this.

    AddSingleton() - As the name implies, AddSingleton() method creates a Singleton service. A Singleton service is created when it is first requested. This same instance is then used by all the subsequent requests. So in general, a Singleton service is created only one time per application and that single instance is used throughout the application life time.

    AddTransient() - This method creates a Transient service. A new instance of a Transient service is created each time it is requested.

    AddScoped() - This method creates a Scoped service. A new instance of a Scoped service is created once per request within the scope. For example, in a web application it creates 1 instance per each http request but uses the same instance in the other calls within that same web request.

提交回复
热议问题