2010-03-31 7 views
5

Estoy trabajando con MEF en este momento, pero la respuesta que estoy buscando probablemente sea irrelevante para MEF, es todo inyección de dependencia. Solo estoy usando la terminología de MEF como ejemplo aquí.¿Cómo exporto e importo servicios de aplicaciones con, por ejemplo, MEF?

historia de fondo a corto, he leído sobre este artículo en MSDN con el foco en Composite Applications

En esta figura hay tres cosas, la concha, los servicios de aplicación y los módulos. Entonces esa es una aplicación compuesta.

alt text http://i.msdn.microsoft.com/cc785479.fig02(en-us).gif

Lo que no entiendo plenamente es la parte de servicios de aplicaciones. ¿Cuál es el servicio, cómo se ve? ¿Cómo expone un servicio a través de un módulo y cómo consume un servicio de un módulo diferente?

Realmente me gustaría ver algunos pequeños ejemplos de código, nada sofisticado pero algo para ilustrar cómo todo esto cobra vida (la parte de servicios de la aplicación).

+5

¡Mis ojos, MIS OJOS! –

+0

Sí, la elección de colores en esa imagen es horrible ... –

Respuesta

3

Los servicios de aplicación, en lo que respecta a MEF, son solo otra parte composable. Cualquier interfaz o clase que pueda componer puede actuar como un servicio.

Cada servicio tendrá alguna interfaz o clase base que desee implementar. Puede hacer esto en masa a través de algún tipo de interfaz IService (y use [ImportMany] para importarlos todos), pero a menudo, querrá diferentes tipos de servicio.

Luego importaría esto, según sea necesario, en sus clases. Por ejemplo, supongamos que tiene una biblioteca de interfaz común de los servicios, y le proporcionará:

public interface IDataRepostory 
{ 
    public IList<MyType> MyTypes { get; } 
} 

entonces usted puede tener un separadas tipos específicos de exportación de biblioteca:

[Export(typeof(IDataRepository))] 
public class Repository: IDataRepostory 
{ 
    // implement interface for this specific "service" 
} 

Su programa principal sería entonces capaz de importe esto según sea necesario y escriba código en su contra. Por ejemplo, supongamos que desea mostrar clientes, deberá cargar los clientes desde su capa de datos. Si quería cargar a través de su repositorio, puede importar el repositorio en una parte específica de su aplicación:

public class CustomersViewModel 
{ 
    [Import] 
    public IDataRepository 
    { 
     get; set; 
    } 

    // ... 
} 

Se podría entonces obtener este servicio compusiste directamente en su aplicación.

Esto se considera un "Servicio de aplicación" porque es una implementación específica de la aplicación de algún servicio genérico; no es un componente relacionado con la vista y puede usarse en toda la aplicación.

+0

Si más de 1 servicio de aplicación satisface la importación, ¿cómo distinguirías entre los dos? metadata? ¿O hay un mejor camino? o es esto simplemente incorrectoSé que MEF lanza una excepción cuando esto sucede, así que ¿realmente solo quiero 1 interfaz y 1 implementación concreta? –

+0

@John: debe usar [ImportMany] y luego consultar el servicio o usar metadatos para determinar cuál usar. De lo contrario, obtienes una excepción. –

+0

@John: si varios servicios usan la misma interfaz/clase de importación, entonces use [ImportMany] e importe en un IEnumerable

0

Declarar la interfaz para el servicio y la clase de exportación que implementa esta interfaz. Por ejemplo, puede tener IPersonBuilder, declarado en ensamblado compartido. Tu módulo principal tiene MyPersonBuilder interfaz de implementación y exportar esto. Todas las vistas usan las importaciones IPersonBuilder para llamar al método y, utilizando la composición MEF, podrán llamar al en su MyPersonBuilder desde su módulo principal.

Cuestiones relacionadas