Deseo inyectar una clase de manera Singleton pero esta clase ocupa un contexto que por defecto es Scoped. He investigado un poco pero no me queda claro aún #8
Comments
En primer lugar hay que entender el ciclo de vida de los objetos que te da la inyección de dependencias. Los ciclos Cada que pidas un Eso quiere decir que siempre que accedas a la instancia transient dentro de tu singleton, será la misma que se creó al principio. Sin embargo, cuando el ciclo de vida es Imagina que guardas los datos del usuario en un
Siempre y cuando inyectes esa clase en otro transient o scoped, no hay tanto problema, pero, ¿qué pasa si lo inyectas en un
Pues como todo en programación... depende :s .... Cuando hablas de un contexto y un singleton, lo más seguro es que quieres hacer un caché para no estar consultado los datos a la base o algo similar, en ese caso la respuesta es... depende.... Cuando quieres hacer un caché, tienes varias opciones, por ejemplo, puedes guardar las cosas por un tiempo determinado (o inluso dejar para siempre) usando la interfaz IMemoryCache, esta tiene la ventaja de que manejará los problemas de concurrencia por ti, su ejemplo es claro:
Este caché es una muy buena ventaja, además de que puedes usar el código que ya está hecho por ti :D. Tiene opciones como usarlo en forma distribuida (si un día despliegas tu aplicación en un cluster de servidores) y también puedes poner en caché vistas y componentes. Si se acomoda a tus necesidades úsala y mete el caché en tu capa de persistencia, antes de consultar revisa si ya está el valor como en el ejemplo; sin embargo tiene sus detalles, ya que debes definir un tiempo de vida para el caché, pero ¿qué pasa si necesitas que una instancia se actualice en el código en cuanto cambian su valor?. En ese caso tienes un problema de concurrencia, ya que tendrás muchos clientes leyendo tu caché y de repente puede entrar un update que cambie los valores a mitad del método de lectura de otros. En ese caso si, puedes usar un singleton para controlar este acceso, un ejemplo de lo que te comento: En una aplicación que corre en un solo servidor, tenemos una serie de llaves/valores que guardamos en una base de datos, accedemos mucho a estas llaves y se modifican muy poco, sin embargo cuando alguien cambie un valor, es prioritario que inmediatamente se vea reflejado en nuestros clientes, para lograrlo agregamos un singleton que incluye un candado de lectura/escritura, para asegurarnos que cuando alguien escribe, nadie pueda leer los datos:
Más información en los links, o |
Mmmm, después de estar revisando... hablando de lo rápido que cambia la tecnología :s... De acuerdo a este issue ya movieron
Puedes buscar el parámetro dentro del método
La última y menos recomendable opción es apagar este warning de Core, ya que aunque el contexto es scoped, como no se necesita nada del request podrías forzarlo a portarse como transient, pero puedes dispararte en el pie después. No tuve oportunidad de revisar bien las posibilidades por que ando en la chamba, pero en la noche le doy una revisada, justo vamos a tener este mismo problema en uno de nuestros sistemas ahora que actualicemos, jajajajaja. |
Había sospechado eso jajaja.. ya que en la clase del curso fer me indicó una solución similar. A fin de cuenta es un detalle de versiones... está interesante como solucionarlo sin hacer mucho ruido pero ntp no hay apuro! thx! |
Daniel Aguilar pregunta:
The text was updated successfully, but these errors were encountered: