He subido un ejemplo de código aqui:
http://kartones.net/files/folders/csharp/entry51901.aspxEs un fichero .zip con una solución con 4 proyectos:
- MEFExample: es una aplicación de consola, sería por ejemplo el juego.
- GraphicsCore: es el engine que utilizamos para programar nuestro juego. Como es un super engine permite usar DX y OGL.
- DxBackend: es una implementación de ciertas cosas del engine para DX.
- OglBackend: es una implementación de ciertas cosas del engine para OGL.
El código es totalmente de juguete (strings y poco más), solo es para explicar como se utiliza MEF.
La idea es que MEFExample pueda usar DX u OGL sin necesidad de tener las referencias en el Visual Studio y cosas así. Lo primero es hacer nuestro motor independiente de una libreria u otra. Para eso en GraphicsCore tiene una clase Renderer que es la que se utiliza para pintar, pero las operaciones específicas se esconden detrás de una interfaz IDevice que las implementaciones especificas (DX, OGL) implementarán. Hasta aquí nada nuevo.
La gracia es como obtiene nuestro Renderer un IDevice para poder utilizarlo para pintar:
[Import]
public IDevice Device { get; set; }
Lo importante es el atributo Import, eso le dice a MEF que cuando la aplicación se ejecute busque por algún sitio un IDevice para asignarlo a esa propiedad.
Así que ahora tenemos que en algún sitio crear ese IDevice. Eso se hace en las librerias especificas de DX y OGL de la siguiente manera:
public static class DxExporter
{
[Export]
public static IDevice Device { get; private set; }
static DxExporter()
{
Device = new DxDevice();
}
}
Aquí tenemos una propiedad que tiene un atributo Export. MEF busca para cada Import su Export correspondiente para unirlos. Para asegurarnos que en esa propiedad hay realmente algo y no es null, pues en el constructor estático inicializamos la propiedad.
Ahora, solo nos queda en la aplicación principal decirle a MEF que resuelva los Imports, esto se hace de la siguiente manera.
var catalog = new DirectoryCatalog(@"..\..\..\Libraries");
var container = new CompositionContainer(catalog);
Renderer renderer = new Renderer();
container.SatisfyImportsOnce(renderer);
Lo primero es decirle a MEF donde puede buscar Exports, que eso se hace con un Catalog. En este caso le hemos dicho que busque en un directorio llamado Libraries. Una vez que MEF sabe donde buscar, creamos el Renderer (que tenía el Import del IDevice), y le decimos a MEF que una el Import con algun Export que esté en alguna DLL en la carpeta Libraries (eso es lo que hace la linea SatisfyImportsOnce).
Si ejecutamos la aplicacion tal y como viene, dara un error porque la carpeta Libraries está vacia. Pero si copiamos la dll DxBackend.dll en esa carpeta, entonces la aplicación utilizará el Device de DX, y si copiamos la dll OglBackend.dll entonces utilizará OGL. Si copiamos las dos dará un error porque no le hemos dicho como resolver ese caso (MEF se puede complicar mucho mucho, esto es solo un ejemplo básico).
Ale, espero que ayude
