Este post se refiere a la extensibilidad de vista previa Gestionado marco 2.
Por lo tanto, tuvo una carrera a través de MEF y escribió un rápido "Hola mundo", que se presenta a continuación. Debo decir que fue totalmente fácil sumergirse y comprender. El sistema de catálogo es excelente y hace que la extensión del MEF sea muy sencilla. Es trivial señalarlo en un directorio de complementos y dejar que se encargue del resto. La herencia de MEF a lo largo del Prisma ciertamente se muestra, pero creo que sería extraño si no fuera así, dado que ambos marcos tienen que ver con la composición.
Creo que lo que más me molesta es la "magia" de _container.Compose(). Si observas en la clase HelloMEF, verás que el campo de saludos nunca se inicializa con ninguno de los códigos, lo cual es gracioso. Creo que prefiero la manera en que funcionan los contenedores IoC, donde explícitamente le pides al contenedor que construya un objeto para ti. Me pregunto si algún tipo de inicializador genérico "Nada" o "Vacío" podría estar en orden. es decir
private IGreetings greetings = CompositionServices.Empty<IGreetings>();
Que al menos llena el objeto con "algo" hasta el momento en el código composición contenedor corre a llenarlo con un verdadero "algo". No sé, huele un poco a las palabras clave Empty o Nothing de Visual Basic, que no me gustó. Si alguien más tiene algunas ideas sobre esto, me gustaría escucharlas. Tal vez es algo que solo necesito superar. Está marcado con un gran atributo [Importar] gordo, por lo que no es como si fuera un completo misterio ni nada.
El control de la duración del objeto no es obvio, pero todo es un singleton por defecto a menos que agregue un atributo [CompositionOptions] a la clase exportada. Eso permite que usted especifique Factory o Singleton. Sería bueno ver a Pooled agregado a esta lista en algún momento.
No tengo muy claro cómo funcionan las funciones de tipado de pato. Parece más una inyección de metadatos en la creación de objetos que en la tipa de patos. Y parece que solo puedes agregar un pato adicional. Pero como dije, no tengo muy claro cómo funcionan estas funciones todavía. Espero poder volver y llenar esto más tarde.
Creo que sería una buena idea duplicar las DLL cargadas por DirectoryPartCatalog. En este momento, los archivos DLL están bloqueados una vez que MEF los atrapa. Esto también te permitirá agregar un vigilante de directorio y capturar complementos actualizados. Eso sería muy bueno ...
Finalmente, me preocupa la confianza que tienen las DLL de complementos y cómo, o si, MEF se comportará en un entorno de confianza parcial.Sospecho que las aplicaciones que usan MEF requerirán plena confianza. También podría ser prudente cargar los complementos en su propio Dominio de aplicación. Sé que huele un poco a System.AddIn, pero permitiría una separación muy clara entre los complementos del usuario y los complementos del sistema.
Bien, suficiente charlatanería. Aquí está Hello World en MEF y C#. ¡Disfrutar!
using System;
using System.ComponentModel.Composition;
using System.Reflection;
namespace HelloMEF
{
public interface IGreetings
{
void Hello();
}
[Export(typeof(IGreetings))]
public class Greetings : IGreetings
{
public void Hello()
{
Console.WriteLine("Hello world!");
}
}
class HelloMEF : IDisposable
{
private readonly CompositionContainer _container;
[Import(typeof(IGreetings))]
private IGreetings greetings = null;
public HelloMEF()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
_container = new CompositionContainer(catalog);
var batch = new CompositionBatch();
batch.AddPart(this);
container.Compose(batch);
}
public void Run()
{
greetings.Hello();
}
public void Dispose()
{
_container.Dispose();
}
static void Main()
{
using (var helloMef = new HelloMEF())
helloMef.Run();
}
}
}
recientemente he jugado con vista previa MEF 4, y He limpiado el código un poco. AggregatingComposablePartCatalog es ahora solo AggregateCatalog, etc. Todo alrededor de una gran victoria en mi humilde opinión –