Quantcast
Channel: Planeta Código
Viewing all articles
Browse latest Browse all 2731

Variable not found: Cómo saber si un tipo está registrado en el proveedor de servicios de .NET 6, pero sin necesidad de resolverlo

$
0
0
.NET

Versiones de .NET anteriores a la 6 no disponían de una fórmula específica para determinar si un tipo o interfaz está registrado como servicio en el sistema de inyección de dependencias.

La única forma de hacerlo era intentar resolverlo, usando métodos como GetService() o GetService<T>(), y comprobar si el resultado era null:

var myService = serviceProvider.GetService<IMyService>();
if(myService is null)
{
// El servicio no está registrado, hacemos algo
}

¿Cuál es el inconveniente de esto? Si el servicio no está registrado, ninguno: la llamada retornará un nulo y listo. 

El problema viene cuando sí está registrado, pues estaremos forzando la resolución de un servicio que, en realidad, no necesitamos para nada, pues sólo nos interesaba saber si existía o no. Porque recordemos que la resolución de un servicio podría tener un coste importante en términos de rendimiento, memoria, o incluso efectos colaterales en el estado de la aplicación, especialmente si nuestro servicio depende de otros, que a su vez dependen de otros, etc.

Para simplificar este escenario y hacer más sencilla la implementación de métodos muy flexibles, como los requeridos para las minimal APIs, .NET 6 ha introducido el nuevo servicio IServiceProviderIsService (¡curioso nombre!), cuyo objetivo es proporcionar un mecanismo sencillo para determinar si un tipo de servicio está registrado y accesible a través de un IServiceProvider, pero sin forzar su resolución.

public interface IServiceProviderIsService
{
bool IsService(Type serviceType);
}

La forma de uso es muy sencilla. Basta con obtener una instancia de IServiceProviderIsService y utilizar su método IsService() para determinar si será posible obtener un servicio a través del inyector de dependencias.

public class Foo
{
public Foo(IServiceProviderIsService spis)
{
if (!spis.IsService(typeof(IMyInterface)))
{
// El servicio no está registrado
}
}
}

El uso de este servicio no será muy habitual en nuestras aplicaciones; de hecho, lo más probable es que jamás tengamos que utilizarlo en aplicaciones convencionales. Pero si programamos frameworks, APIs o componentes vale la pena saber que este mecanismo está ahí, por si acaso ;)

Publicado en Variable not found.


Viewing all articles
Browse latest Browse all 2731

Trending Articles


Vimeo 10.7.1 by Vimeo.com, Inc.


UPDATE SC IDOL: TWO BECOME ONE


KASAMBAHAY BILL IN THE HOUSE


Girasoles para colorear


Presence Quotes – Positive Quotes


EASY COME, EASY GO


Love with Heart Breaking Quotes


Re:Mutton Pies (lleechef)


Ka longiing longsem kaba skhem bad kaba khlain ka pynlong kein ia ka...


Vimeo 10.7.0 by Vimeo.com, Inc.


FORECLOSURE OF REAL ESTATE MORTGAGE


FORTUITOUS EVENT


Pokemon para colorear


Sapos para colorear


Smile Quotes


Letting Go Quotes


Love Song lyrics that marks your Heart


RE: Mutton Pies (frankie241)


Hato lada ym dei namar ka jingpyrshah jong U JJM Nichols Roy (Bah Joy) ngin...


Long Distance Relationship Tagalog Love Quotes