ASP.NET Core apps often need to access the same services across multiple components. For example, several components might need to access a service that fetches data from a database. ASP.NET Core uses a built-in dependency injection (DI) container to manage the services that an app uses.
Dependency injection and Inversion of Control (IoC)
The dependency injection pattern is a form of Inversion of Control (IoC). In the dependency injection pattern, a component receives its dependencies from external sources rather than creating them itself. This pattern decouples the code from the dependency, which makes code easier to test and maintain.
Consider the following Program.cs file:
C#Copy
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using MyApp.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<PersonService>();
var app = builder.Build();
app.MapGet("/",
(PersonService personService) =>
{
return $"Hello, {personService.GetPersonName()}!";
}
);
app.Run();
And the following PersonService.cs file:
C#Copy
namespace MyApp.Services;
public class PersonService
{
public string GetPersonName()
{
return "John Doe";
}
}
To understand the code, start with the highlighted app.MapGet
code. This code maps HTTP GET requests for the root URL (/
) to a delegate that returns a greeting message. The delegate’s signature defines an PersonService
parameter named personService
. When the app runs and a client requests the root URL, the code inside the delegate depends on the PersonService
service to get some text to include in the greeting message.
Where does the delegate get the PersonService
service? It’s implicitly provided by the service container. The highlighted builder.Services.AddSingleton<PersonService>()
line tells the service container to create a new instance of the PersonService
class when the app starts, and to provide that instance to any component that needs it.
Any component that needs the PersonService
service can declare a parameter of type PersonService
in its delegate signature. The service container will automatically provide an instance of the PersonService
class when the component is created. The delegate doesn’t create the PersonService
instance itself, it just uses the instance that the service container provides.
https://lernix.com.my/g-add-m
Leave a Reply