c# - que - inyección de dependencias en spring
¿Es posible inyectar una instancia existente en un complemento MEF? (1)
Estamos creando una aplicación que admite complementos utilizando MEF. Estamos determinando qué tipo de complementos puede crear el usuario y queremos usar la inyección de dependencia para proporcionar este tipo de complemento con los datos que necesita.
Por ejemplo, hacemos un complemento que puede mostrar una lista. Para lograr esto, necesita la instancia existente del IRepository para el tipo de datos que se mostrará en la lista.
El IRepository se crea en otro lugar en una clase de contexto de datos, por lo que no podemos permitir que MEF cree una instancia del IRepository.
Mi idea es inyectar la instancia existente del IRepository en el plugin a través del importingconstructor; sin embargo, para que esto funcione, tengo que hacer que MEF conozca el IRepository ya instanciado, y no he podido encontrar la manera de hacerlo. Cualquier ayuda sería apreciada.
La forma más fácil es componer un valor existente en el contenedor, por ejemplo:
var repo = // Create repo
container.ComposeExportedValue<IRepository>(repo);
Pero esto solo permitirá que 1 instancia del IRepository
exista, porque no le da control directo sobre ComposablePart
que se crea. Si desea un control de grano más fino, puede usar un CompositionBatch
con gran efecto:
var batch = new CompositionBatch();
var repo = // Create repo
var repoPart = batch.AddExportedValue<IRepository>(repo);
container.Compose(batch);
// repo will now be injected on any matching [Import] or [ImportingConstructor]
Y luego:
var batch2 = new CompositionBatch(null, new[] { repoPart });
var repo2 = // Get new repo
var repo2Part = batch2.AddExportedValue<IRepository>(repo2);
container.Compose(batch2);
Como tengo acceso a la instancia de ComposablePart
proporcionada por el lote, puedo eliminarlo más adelante. Hay otras maneras de importar partes sin atributos, generalmente a través de exportaciones de propiedades:
[Export(typeof(IRepository))]
public IRepository Repository
{
get { return CreateRepository(); }
}
Pero eso, por supuesto, requeriría que pueda crear una instancia de su repositorio en el momento de la composición, lo que puede o no ser posible.
Por último, existe la opción de utilizar un modelo de programación alternativo. El valor predeterminado (y más común) en MEF es el modelo de programación atribuido , mediante el cual utiliza atributos [Export]
e [Import]
para controlar su composición, pero en MEFContrib (y de próxima aparición en MEF2) está la posibilidad de utilizar un modelo de programación de registro las piezas se componen en base a un mecanismo similar a la mayoría de los otros contenedores de IoC.