Quiero implementar la inyección de dependencia (DI) en ASP.NET Core. Entonces, después de agregar este código al ConfigureServices
método, ambas formas funcionan.
¿Cuál es la diferencia entre los métodos services.AddTransient
y service.AddScoped
en ASP.NET Core?
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddScoped<IEmailSender, AuthMessageSender>();
}
c#
asp.net-core
.net-core
Elvin Mammadov
fuente
fuente
Respuestas:
TL; DR
Para más aclaraciones, este ejemplo de la documentación de ASP.NET muestra la diferencia:
Para demostrar la diferencia entre estas opciones de vida y de registro, considere una interfaz simple que representa una o más tareas como una operación con un identificador único,
OperationId
. Dependiendo de cómo configuremos la vida útil de este servicio, el contenedor proporcionará la misma o diferentes instancias del servicio a la clase solicitante. Para dejar en claro qué duración se solicita, crearemos una opción de tipo por duración:Implementamos estas interfaces usando una sola clase,
Operation
que acepta un GUID en su constructor, o usa un nuevo GUID si no se proporciona ninguno:A continuación, en
ConfigureServices
, cada tipo se agrega al contenedor de acuerdo con su vida útil nombrada:Tenga en cuenta que el
IOperationSingletonInstance
servicio está utilizando una instancia específica con un ID conocido deGuid.Empty
, por lo que quedará claro cuando este tipo esté en uso. También hemos registrado unoOperationService
que depende de cada uno de los otrosOperation
tipos, de modo que quede claro dentro de una solicitud si este servicio está obteniendo la misma instancia que el controlador, o una nueva, para cada tipo de operación. Todo lo que hace este servicio es exponer sus dependencias como propiedades, para que puedan mostrarse en la vista.Para demostrar las vidas de los objetos dentro y entre solicitudes individuales separadas a la aplicación, la muestra incluye un
OperationsController
que solicita cada tipo deIOperation
tipo, así como unOperationService
. LaIndex
acción luego muestra todos losOperationId
valores del controlador y del servicio .Ahora se realizan dos solicitudes separadas para esta acción del controlador:
Observe cuál de los
OperationId
valores varía dentro de una solicitud y entre solicitudes.Los objetos transitorios son siempre diferentes; Se proporciona una nueva instancia para cada controlador y cada servicio.
Los objetos de ámbito son los mismos dentro de una solicitud, pero diferentes en diferentes solicitudes
Los objetos Singleton son los mismos para cada objeto y cada solicitud (independientemente de si se proporciona una instancia
ConfigureServices
)fuente
En la inyección de dependencia de .NET hay tres vidas principales:
Singleton que crea una sola instancia en toda la aplicación. Crea la instancia por primera vez y reutiliza el mismo objeto en todas las llamadas.
Los servicios de por vida con ámbito se crean una vez por solicitud dentro del alcance. Es equivalente a un singleton en el alcance actual. Por ejemplo, en MVC crea una instancia para cada solicitud HTTP, pero usa la misma instancia en las otras llamadas dentro de la misma solicitud web.
Los servicios transitorios de por vida se crean cada vez que se solicitan. Esta vida útil funciona mejor para servicios ligeros y sin estado.
Aquí puedes encontrar ejemplos para ver la diferencia:
Inyección de dependencia de ASP.NET 5 MVC6 en 6 pasos (enlace a archivo web debido a enlace inactivo )
Su inyección de dependencia lista ASP.NET: ASP.NET 5
Y este es el enlace a la documentación oficial:
Inyección de dependencias en ASP.NET Core
fuente
El proceso de creación de objetos transitorio, de ámbito y de definición única en ASP.NET MVC core DI cuando se deben inyectar varios objetos del mismo tipo. En caso de que sea nuevo en la inyección de dependencias, puede ver este video DI IoC .
Puede ver el siguiente código de controlador en el que solicité dos instancias de "IDal" en el constructor. Transient, Scoped y Singleton definen si la misma instancia se inyectará en "_dal" y "_dal1" o diferente.
Transitorio: en transitorio, se inyectarán nuevas instancias de objeto en una sola solicitud y respuesta. A continuación se muestra una imagen instantánea donde mostré valores GUID.
Ámbito: en ámbito, la misma instancia de objeto se inyectará en una sola solicitud y respuesta.
Singleton: en singleton, se inyectará el mismo objeto en todas las solicitudes y respuestas. En este caso, se creará una instancia global del objeto.
A continuación se muestra un diagrama simple que explica los principios fundamentales anteriores visualmente.
La imagen de arriba fue dibujada por el equipo de SBSS cuando estaba tomando el entrenamiento ASP.NET MVC en Mumbai . Muchas gracias al equipo de SBSS por crear la imagen de arriba.
fuente
new TService
. Scoped almacenará en caché la primera inicialización de ese "alcance" (solicitud http en la mayoría de los casos). Singleton almacenará en caché solo una instancia para toda la vida de la aplicación, así de simple. Los diagramas anteriores son muy complicados.Normalmente, la solicitud de código debe hacerse a través de un parámetro constructor, como en
Quería señalar en la respuesta de @ akazemis que "servicios" en el contexto de DI no implica servicios RESTful; Los servicios son implementaciones de dependencias que proporcionan funcionalidad.
fuente
AddSingleton ()
AddSingleton () crea una única instancia del servicio cuando se solicita por primera vez y reutiliza esa misma instancia en todos los lugares donde se necesita ese servicio.
AddScoped ()
En un servicio con alcance, con cada solicitud HTTP, obtenemos una nueva instancia. Sin embargo, dentro de la misma solicitud HTTP, si el servicio se requiere en varios lugares, como en la vista y en el controlador, se proporciona la misma instancia para todo el alcance de esa solicitud HTTP. Pero cada nueva solicitud HTTP obtendrá una nueva instancia del servicio.
AddTransient ()
Con un servicio transitorio, se proporciona una nueva instancia cada vez que se solicita una instancia de servicio, ya sea que esté dentro del alcance de la misma solicitud HTTP o en diferentes solicitudes HTTP.
fuente
Después de buscar una respuesta a esta pregunta, encontré una explicación brillante con un ejemplo que me gustaría compartir con ustedes.
Puedes ver un video que demuestra las diferencias AQUÍ
En este ejemplo tenemos este código dado:
HomeController
Crear vista
Startup.cs
Copie y pegue este código y presione el botón crear en la vista y cambie entre ellos
AddSingleton
,AddScoped
yAddTransient
obtendrá cada vez un resultado diferente que podría ayudarlo a comprender esta explicación:fuente
Cual usar
Transitorio
Alcance
único
Use Singletons donde necesite mantener el estado amplio de la aplicación. La configuración o los parámetros de la aplicación, el Servicio de registro y el almacenamiento en caché de datos son algunos de los ejemplos en los que puede usar singletons.
Inyectar servicio con diferentes vidas en otro
fuente
Como se describe aquí (este enlace es muy útil) con un ejemplo,
fuente
Registrar servicios
ASP.NET core proporciona los siguientes 3 métodos para registrar servicios con el contenedor de inyección de dependencia. El método que utilizamos determina la vida útil del servicio registrado.
AddSingleton (): como su nombre lo indica, el método AddSingleton () crea un servicio Singleton. Se crea un servicio Singleton cuando se solicita por primera vez. Esta misma instancia es utilizada por todas las solicitudes posteriores. Por lo tanto, en general, un servicio Singleton se crea solo una vez por aplicación y esa instancia única se usa durante toda la vida útil de la aplicación.
AddTransient (): este método crea un servicio transitorio. Cada vez que se solicita, se crea una nueva instancia de un servicio Transitorio.
AddScoped (): este método crea un servicio con ámbito. Se crea una nueva instancia de un servicio con ámbito una vez por solicitud dentro del alcance. Por ejemplo, en una aplicación web crea 1 instancia por cada solicitud http pero usa la misma instancia en las otras llamadas dentro de esa misma solicitud web.
fuente