Estoy aprendiendo MEF y quería crear un ejemplo simple (aplicación) para ver cómo funciona en acción. Por lo tanto, pensé en un simple traductor. He creado una solución con cuatro proyectos (archivos DLL):Uso adecuado del atributo [Importar] en MEF
contratos
Web
Bing Translator
GoogleTranslator
contratos contiene la interfaz ITranslate
. Como se aplica el nombre, solo contendría contratos (interfaces), por lo que los exportadores e importadores pueden usarlo.
public interface ITranslator
{
string Translate(string text);
}
Bing Translator y GoogleTranslator son ambos exportadores de este contrato. Ambos implementan este contrato y proporcionan (exportan) diferentes servicios de traducción (uno de Bing, otro de Google).
[Export(typeof(ITranslator))]
public class GoogleTranslator: ITranslator
{
public string Translate(string text)
{
// Here, I would connect to Google translate and do the work.
return "Translated by Google Translator";
}
}
y la BingTranslator
es:
[Export(typeof(ITranslator))]
public class BingTranslator : ITranslator
{
public string Translate(string text)
{
return "Translated by Bing";
}
}
Ahora, en mi proyecto Web, simplemente quiero obtener el texto del usuario, traducirlo con uno de los traductores (Bing y Google), y devolver el resultado al usuario. Por lo tanto, en mi aplicación Web, dependo de un traductor. Por lo tanto, he creado un controlador de esta manera:
public class GeneralController : Controller
{
[Import]
public ITranslator Translator { get; set; }
public JsonResult Translate(string text)
{
return Json(new
{
source = text,
translation = Translator.Translate(text)
});
}
}
y la última pieza del rompecabezas debe ser para pegar estos componentes (partes) juntos (para componer la canción en general a partir de piezas más pequeñas). Así, en Application_Start
del proyecto Web, que tengo:
var parts = new AggregateCatalog
(
new DirectoryCatalog(Server.MapPath("/parts")),
new DirectoryCatalog(Server.MapPath("/bin"))
);
var composer = new CompositionContainer(parts);
composer.ComposeParts();
en el que /parts
es la carpeta en la que se me cae GoogleTranslator.dll y BingTranslator.dll archivos (exportadores se encuentran en estos archivos) , y en la carpeta /bin
simplemente tengo mi Web.dll archivo que contiene el importador. Sin embargo, mi problema es que MEF no puebla Translator
propiedad del GeneralController
con el traductor requerido. Leí casi todas las preguntas relacionadas con MEF en este sitio, pero no pude entender cuál es el problema con mi ejemplo. ¿Alguien puede decirme qué he perdido aquí?
Gracias por responder a @Aliostad, pero francamente no entendí qué debería hacer para que '[Import]' funcione en mi propiedad 'Translator'. –
@SaeedNeamati Bien, lo he actualizado para demostrar cómo usarlo. – Aliostad
Bueno, aquí está la contraparte de su vista: MEF es parte de .NET y un marco de DI bastante bueno en sí mismo. El uso de otro en la mayoría de los casos no está justificado y simplemente introduce OTRA tecnología sin ganancia (es decir, valor de mantenimiento negativo). Acabo de terminar un proyecto de 18 meses SOLAMENTE usando MEF;) Funcionó bastante bien. – TomTom