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.

Prism: Inyectar servicio en un constructor sin parámetros.

Tengo tres clases:

  • MyModel (objeto POCO puro)
  • MyModelWrapper (heredado de BindableBase)
  • MyViewModel (también hereda de la clase Bindable)

El problema que tengo es que necesito un constructor sin parámetros en MyModelWrapper porque enlazo un objeto en MyViewModel que es una ObservableCollection<MyModelWrapper> a un Datagrid Itemssource, y si no tiene un constructor sin parámetros, no puedes insertar nuevas filas en el mismo (no aparece una línea en blanco al final del Datagrid).

Por lo tanto, si quiero que el usuario pueda insertar nuevas filas, necesito un constructor sin parámetros (y quiero hacerlo).

Y aquí tengo mi problema: Necesito inyectar un servicio en MyModelWrapper.

Puedo inyectar el servicio en el constructor:

IMyModelWrapperService Service;
public MyModelWrapper(IMyModelWrapperService Service)
{
    Service = service;
}

Pero de esta manera, el Datagrid no permite al usuario insertar nuevas filas.

Si pudiera obtener una referencia al contenedor, podría hacer container.Resolve<IMyModelWrapper>(), pero creo que también necesitaría inyectar el contenedor a través del constructor, por lo que no es una solución válida.

Entonces, necesitaría algo como:

[Inject]
IMyModelWrapperService Service;

Pero creo que la inyección de propiedades no funciona en Prism (al menos no puedo usarla).

¿Cuál es el enfoque correcto para inyectar un servicio en una clase que necesita ser sin parámetros en Prism?

Gracias

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una posible solución podría ser usar un patrón de fábrica para crear instancias de MyModelWrapper. La fábrica tendría acceso al contenedor y podría resolver las dependencias necesarias antes de devolver la nueva instancia. De esta manera, la clase MyModelWrapper sigue teniendo un constructor sin parámetros, y el servicio puede ser inyectado a través de la fábrica.

    La fábrica podría ser así:

    public class MyModelWrapperFactory : IMyModelWrapperFactory
    {
        private readonly IUnityContainer _container;
    
        public MyModelWrapperFactory(IUnityContainer container)
        {
            _container = container;
        }
    
        public MyModelWrapper Create()
        {
            var wrapper = _container.Resolve<mymodelwrapper>();
            // Inyectar las dependencias necesarias aquí
            wrapper.Service = _container.Resolve<imymodelwrapperservice>();
            return wrapper;
        }
    }
    

    Entonces, en MyViewModel, en lugar de crear nuevas instancias de MyModelWrapper directamente, puedes usar la fábrica:

    public class MyViewModel
    {
        private readonly IMyModelWrapperFactory _wrapperFactory;
    
        public MyViewModel(IMyModelWrapperFactory wrapperFactory)
        {
            _wrapperFactory = wrapperFactory;
        }
    
        public void AddNewWrapper()
        {
            var wrapper = _wrapperFactory.Create();
            // Agregar un nuevo MyModelWrapper al ObservableCollection aquí
        }
    }
    

    De esta manera, cuando se crea una nueva instancia de MyModelWrapper a través de la fábrica, se inyectarán las dependencias necesarias, y la unión con ObservableCollection funcionará correctamente.

Comments are closed.