.net mvvm dependency-injection autofac caliburn.micro

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