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.

Caliburn.Micro Contenedor Simple de Múltiples Instancias de Interfaces

Estoy tratando esencialmente de ejecutar un control de pestañas utilizando el Contenedor Simple de Caliburn Micro, donde cada Modelo de Vista de Pestaña implementa una interfaz “IMainScreenTabItem” en C#.

Cuando configuro el contenedor, puedo hacer algo como esto:

container.AllTypesOf<imainscreentabitem>(Assembly.GetExecutingAssembly());

Esto me permitirá obtener todos los Modelos de Vista que implementan IMainScreenTabItem en el constructor del Modelo de Vista del control de pestañas de esta manera:

public TabControlViewModel(IEnumerable<imainscreentabitem> tabs){ Items.AddRange(tabs); }

El problema con esta aplicación específica es que no quiero que las implementaciones se mantengan como instancias únicas cuando se elimina el TabControlViewModel, y el método .AllTypesOf las registra como instancias únicas.

Puedo crearlos todos codificando cada Modelo de Vista de la siguiente manera:

container.Instance(container)
            .PerRequest<imainscreentabitem, tabitem1="">()
            .PerRequest<imainscreentabitem, tabitem2="">();

y así sucesivamente, pero eso parece un poco desordenado.

Estaba pensando en algo como esto:

var tabs = GetType().Assembly.GetTypes()
            .Where(type => type.IsClass)
            .Where(type => !type.IsAbstract)
            .Where(type => type.GetInterface(nameof(IMainScreenTabItem)) != null);

tabs.ToList().ForEach(tab => container.RegisterPerRequest(typeof(IMainScreenTabItem), tab.ToString(), tab));

El problema con eso es que .RegisterPerRequest no me permite tener múltiples implementaciones de una sola interfaz como .PerRequest lo hace.

El sitio web de Caliburn Micro describe la diferencia de la siguiente manera: “El registro Per Request causa la creación de la entidad devuelta una vez por petición. Esto significa que dos peticiones diferentes de la misma entidad resultarán en dos instancias distintas siendo creadas.”
https://caliburnmicro.com/documentation/simple-container

Así que me gustaría hacer algo como esto:

tabs.ToList().ForEach(tab => container.PerRequest<imainscreentabitem, tab="">());

pero obviamente obtengo el mensaje de error “tab es una variable pero se utiliza como tipo”.

¡Cualquier idea sobre esto sería muy apreciada! Este es mi primer proyecto de Caliburn Micro, así que es posible que me esté perdiendo algo simple.

¡Gracias de antemano!</imainscreentabitem,></imainscreentabitem,></imainscreentabitem,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para registrar múltiples implementaciones de una interfaz con Caliburn Micro’s Simple Container

    Si quieres registrar múltiples implementaciones de una interfaz utilizando Caliburn Micro’s Simple Container, puedes usar el método RegisterManyForOpenGeneric con una convención de registro. Aquí tienes un ejemplo:

    container.RegisterManyForOpenGeneric(typeof(IMainScreenTabItem), 
        types => types.Where(type => type.IsClass && !type.IsAbstract),
        (service, implementation) => container.PerRequest(service, implementation));
    

    Este código escaneará todas las clases en la librería en busca de aquellas que implementen IMainScreenTabItem, y luego registrará cada implementación con el ámbito PerRequest.

    Ten en cuenta que este código asume que todas las implementaciones de IMainScreenTabItem tienen un constructor por defecto. Si alguna implementación requiere inyección de dependencias en el constructor, tendrás que modificar la convención de registro en consecuencia.

    Espero que esto te ayude. Avísame si tienes alguna otra pregunta.

Comments are closed.