.net - Fábricas Autofac y Func
mvvm dependency-injection (1)
Está llamando a secVMFactory
fuera de su constructor FirstViewModel
para que en ese momento resolveOperation esté dispuesto y en su método de fábrica el c.Resolve
emitirá la excepción.
Afortunadamente, el mensaje de excepción es muy descriptivo y te dice qué hacer:
Al registrar componentes usando lambdas, el parámetro IComponentContext ''c'' de la lambda no se puede almacenar. En su lugar, resuelva IComponentContext nuevamente desde ''c''
Entonces, en lugar de llamar a c.Resolve
, debe resolver el IComponentContext
de c
y usarlo en su func de fábrica:
builder.Register<Func<IEventAggregator, SecondViewModel>>(c => {
var context = c.Resolve<IComponentContext>();
return ea => {
return new SecondViewModel(context.Resolve<IEventAggregator>(), ea);
};
});
Estoy trabajando en una aplicación usando Caliburn.Micro y Autofac.
En mi raíz de composición ahora estoy enfrentando un problema con Autofac: tengo que inyectar el IEventAggregator de uso global en mi FirstViewModel, y un segundo IEventAggregator que debe ser utilizado solo por este FirstViewModel y sus hijos.
Mi idea era hacer que la segunda se inyectara como Owned<IEA>
, y funciona, el contenedor proporciona una instancia diferente de IEA.
public FirstViewModel(
IEventAggregator globalEA,
IEventAggregator localEA,
Func<IEventAggregator, SecondViewModel> secVMFactory) {}
El problema surge cuando tengo que proporcionar los agregadores de eventos al SecondViewModel.
Para crear SecondViewModel utilizo un método de fábrica como Func<IEA, SecondVM>
. El constructor de SecondViewModel es el siguiente:
public SecondViewModel(IEventAggregator globalEA, IEventAggregator localEA) {}
Quiero que el contenedor inyecte el primero como el registrado, y el segundo será el parámetro IEA del Func<IEA, SecVM>
.
esta es la función que registré en el contenedor:
builder.Register<Func<IEventAggregator, SecondViewModel>>(
c =>
(ea) =>
{
return new SecondViewModel(
c.Resolve<IEventAggregator>(),
ea);
}
);
pero cuando FirstViewModel
lo FirstViewModel
, FirstViewModel
el siguiente error:
Se produjo una excepción del tipo ''System.ObjectDisposedException'' en Autofac.dll pero no se manejó en el código de usuario
Información adicional: esta operación de resolución ya ha finalizado. Al registrar componentes usando lambdas, el parámetro IComponentContext ''c'' de la lambda no se puede almacenar. En su lugar, resuelva IComponentContext nuevamente desde ''c'' o resuelva una fábrica basada en Func <> para crear componentes posteriores.
No puedo entender dónde está el problema, ¿me pueden ayudar, por favor, qué me estoy perdiendo?
Gracias.