Resolución de la Unidad de Trabajo Ambitada en Prism Xamarin con DryIoc.
En una aplicación Prism Xamarin con DryIoc como contenedor, tengo una Unidad de Trabajo que es referenciada por varios otros componentes que luego son referenciados desde modelos de vista. Se ve algo así (se omiten las declaraciones de interfaz por brevedad):
public class UnitOfWork : IUnitOfWork {…}
public class Service1 : IService1 {
public Service1(IUnitOfWork unitOfWork) {…}
}
public class Service2 : IService2 {
public Service2(IUnitOfWork unitOfWork) {…}
}
public class MyViewModel {
public MyViewModel(IService1 service1, IService2 service2) {…}
}
He registrado Service1, Service2 y UnitOfWork como transitorios, lo que significa que cuando se instancie MyViewModel, se crearán dos instancias de UnitOfWork, una para la referencia en Service1 y otra para la referencia en Service2. Quiero que se use la misma instancia de UnitOfWork para ambos Service1 y Service2. Sin embargo, no quiero usar una sola instancia, sino que estoy buscando una instancia anidada, con el ámbito siendo igual a la creación del modelo de vista correspondiente.
DryIoc admite ámbitos, pero no puedo encontrar información sobre el uso de ámbitos en Prism. Encontré un sitio que describe los contenedores de Prism y DryIoc en particular, pero su página sobre ámbitos está vacía.
Estoy buscando documentación o ejemplos sobre cómo introducir y administrar ámbitos en Prism. Cualquier ayuda al respecto es apreciada.
ACTUALIZAR:
Descubrí que Prism/DryIoc crea un ámbito para cada Vista/Modelo de Vista que se abre, por lo que si los servicios están registrados como anidados, también se resolverán por Vista/Modelo de Vista. Sin embargo, no puedo encontrar ninguna manera de configurar estos ámbitos, asignar nombres, etc. y tampoco puedo encontrar ninguna documentación al respecto.
davy.ai
Solución para la Instanciación Escalonada con DryIoc en Prism Xamarin
Si desea tener una instanciación escalonada de UnitOfWork en Prism Xamarin con DryIoc como contenedor, puede registrarlo como un servicio escalonado. Esto aseguraría que se utilice la misma instancia de UnitOfWork para tanto Service1 como Service2 dentro del alcance del ViewModel correspondiente.
DryIoc admite ámbitos y Prism/DryIoc crea un ámbito para cada Vista/ViewModel que se abre. Por lo tanto, si los servicios se registran como escalonados, también se resolverán por Vista/ViewModel.
Sin embargo, actualmente no hay una manera documentada de configurar estos ámbitos, asignar nombres, etc. Para lograr un control más granular sobre el comportamiento de los servicios escalonados, debería implementar su propia interfaz IScopedProvider y registrarlo con DryIoc. Esta interfaz proporcionará métodos para crear y eliminar ámbitos, y para resolver servicios dentro de un ámbito específico.
Aquí hay un ejemplo de cómo registrar los servicios escalonados en DryIoc:
Al utilizar la opción
Reuse.ScopedOrSingleton
, DryIoc creará una nueva instancia del servicio dentro del alcance del ViewModel correspondiente, pero también reutilizará la instancia si se vuelve a llamar dentro del mismo alcance.Para crear su propia interfaz IScopedProvider, podría comenzar con el siguiente ejemplo:
Esta interfaz proporciona métodos para comenzar y finalizar un ámbito, y para resolver servicios dentro de un ámbito específico. Luego podría implementar esta interfaz en una clase que gestione los ámbitos, y registrarlo con DryIoc de la siguiente manera:
Al hacer esto, tiene más control sobre la duración de los servicios escalonados, y puede configurar los ámbitos según sea necesario.</iservice2,></iservice1,></iunitofwork,>