Sé que ha habido muchas preguntas con respecto a la inyección de parámetros de constructor usando MEF, pero la mía es un poco diferente.MEF: Pasar parámetros de constructor diferentes a una parte al usar CreationPolicy.NonShared
Quiero saber que hay alguna forma de pasar diferentes valores de parámetros al constructor de una pieza cuando estoy usando la combinación de PartCreationPolicy(CreationPolicy.NonShared)
y GetExportedValue
?
Por ejemplo:
[PartCreationPolicy(CreationPolicy.NonShared)]
[Export]
public partial class Foo
{
[ImportingConstructor]
public Foo([Import("SomeParam")]object parameter)
{
...
}
}
y en otro lugar ...
container.ComposeExportedValue("SomeParam", "Some value...");
var instance = container.GetExportedValue<Foo>();
En el ejemplo anterior, puedo usar ComposeExportedValue
sólo una vez, como correr una segunda vez causará una ChangeRejectedException
.
Por lo tanto, mis preguntas son:
- ¿Hay alguna otra manera de cambiar el valor de
SomeParam
en el escenario anterior, para cada nueva instancia? - Si no, ¿cuáles son las otras formas en que esto se puede lograr sin utilizar ningún otro marco DI? Una cosa que me viene a la mente es crear un servicio para exponer algo como
System.Collections.Concurrent.ConcurrentQueue
donde pongo en cola un valor de parámetro antes de llamar alGetExportedValue
y luego dequeue el valor en el constructor de la pieza. Pero eso es un truco y también crea más problemas de los que resuelve. - Si la respuesta a ambas preguntas es no, ¿hay alguna otra forma de lograr esto con una combinación de MEF y algún otro marco DI/IOC?
Gracias por cualquier ayuda. :) Saludos,
Yogesh JAGOTA
estoy mirando autofac/Integración MEF pero ¿cómo puedo manejar el registro cuando se utiliza 'RegisterComposablePartCatalog'? No puedo usar 'Registrarse' aquí ya que AutoFac lo hace automáticamente. ¿Cómo puedo decirle a AutoFac que una determinada exportación necesita ser instanciada usando un constructor no predeterminado con los parámetros que proporciono sin usar el '[ImportingConstructor]'? – Yogesh
@Yogesh: Puede tener algunos componentes registrados con AutoFac (cuando necesita un control detallado) y otros exportados con MEF (cuando necesita un descubrimiento dinámico de complementos). Pero no puedes mezclar ambos para el mismo componente. Otra opción es cambiar a AutoFac por completo; puede usar [Escaneo] (http://code.google.com/p/autofac/wiki/Scanning) para obtener un descubrimiento dinámico similar a MEF donde sea necesario. –
Realmente funcionó. La forma de hacerlo es usar el método 'Update' de' IContainer' que permite agregar nuevos registros a un contenedor existente. Gracias. :) – Yogesh