es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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:

    // Registrar los servicios como escalonados
    container.Register<iunitofwork, unitofwork="">(Reuse.ScopedOrSingleton);
    container.Register<iservice1, service1="">(Reuse.ScopedOrSingleton);
    container.Register<iservice2, service2="">(Reuse.ScopedOrSingleton);
    

    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:

    public interface IScopedProvider
    {
        IDisposable BeginScope();
        object ResolveScoped(Type serviceType, object key = null);
        TService ResolveScoped<tservice>(object key = null);
    }
    

    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:

    // Registrar el proveedor escalonado
    container.Register<iscopedprovider>(made: Made.Of(() => new MyScopedProvider(Arg.Of<iresolver>())));
    

    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,>

Comments are closed.