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
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,>
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: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 ámbitoPerRequest
.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.