La inyección de dependencia de Symfony no funciona
En este ejemplo, ampliamos la tabla de datos del ejemplo 1 con otra columna, que representa la suma total de todos los tiempos de respuesta de las peticiones de una conexión específica (por ejemplo, la suma de todos los tiempos de respuesta de las peticiones HTTP).
Ahora, la opción de mapeo de datos del panel Columna de tiempo de respuesta se establece como resp_time. Esto especifica que el valor de la columna resp_time debe manejarse como el tiempo de respuesta de una conexión. Por defecto, los valores de esta columna se manejarán como una suma de todos los tiempos de respuesta – una especie de métrica al estilo de Prometheus. Este comportamiento puede cambiarse utilizando la opción Manejar tiempos como sumas. Esta tabla dará como resultado la siguiente visualización.
Ejemplo de inyección de dependencia en C#
El primer paso para poder invocar la funcionalidad de la plataforma nativa desde el código compartido, es crear una interfaz que defina la API para interactuar con la funcionalidad de la plataforma nativa. Esta interfaz debe colocarse en su proyecto de código compartido.
Después de implementar la interfaz en cada proyecto de plataforma, las implementaciones de la plataforma deben registrarse en DependencyService para que Xamarin.Forms pueda localizarlas en tiempo de ejecución. Esto se suele realizar con el atributo DependencyAttribute, que indica que el tipo especificado proporciona una implementación de la interfaz.
Tras el registro de las implementaciones de la plataforma con el DependencyService, las implementaciones deben resolverse antes de ser invocadas. Esto se realiza normalmente en código compartido utilizando el método DependencyService.Get<T>.
Qué es el síndrome de dependencia
Xamarin.Forms incluye un DependencyService para permitir que el código compartido resuelva fácilmente las interfaces a las implementaciones específicas de la plataforma, lo que le permite acceder a las características de los SDK de iOS, Android y Windows Phone desde su PCL o proyecto compartido.
El problema con DependencyService de Xamarin es que requiere una llamada estática a DependencyService.Get<> en el código compartido para obtener una instancia específica de la plataforma de la interfaz en tiempo de ejecución. Esto hace que tus ViewModels sean menos comprobables y oculta las dependencias de tu clase.
También puedes obtener acceso al DependencyService de Xamarin utilizando la interfaz IDependencyService. Esta interfaz elimina la llamada estática en su ViewModel, pero sigue dándole acceso a la API de DependencyService de Xamarin.
En este ejemplo, aprovecharemos la API de voz de cada plataforma para proporcionar capacidades de texto a voz a nuestra aplicación. Esto significa que tenemos que crear un servicio para cada plataforma que invoque la API de voz de esa plataforma específica.
Ahora, añade el atributo DependencyService a cada una de las clases de servicio en las respectivas plataformas. Esto registra la implementación específica de la plataforma del servicio de voz con DependencyService de Xamarin.Forms.
Síntomas del síndrome de dependencia
Nota: Más adelante, en 2022, Resolver quedará obsoleto y será sustituido por mi nuevo sistema de inyección de dependencias, Factory. Factory es seguro en tiempo de compilación y es más pequeño, ligero y rápido que Resolver. Por muy bueno que sea Resolver, Factory es mejor.
Resolver también está diseñado para el rendimiento. SwinjectStoryboard, por ejemplo, es un gran sistema de inyección de dependencias, pero Resolver es un 800% más rápido que Swinject a la hora de resolver cadenas de dependencias.
Resolver ha sido diseñado, implementado, documentado y mantenido por Michael Long, ingeniero jefe de iOS en CRi Solutions. CRi es líder en el desarrollo de aplicaciones y soluciones web móviles e iOS de vanguardia para nuestros clientes corporativos y financieros.