Cómo utilizar DLR con el MEF en .Net 4.0?
-
21-08-2019 - |
Pregunta
Hubo promesas del equipo de MEF MEF que apoyará plugins DLR en .NET 4.0. ¿Sucedió ya y puedo [Import] algunos objetos IronPython?
Si es así, cualquier vínculo con el tema sería de gran ayuda.
Solución
El modelo de programación por defecto no es compatible con el DLR, pero otros modelos de programación se puede escribir que va a apoyar, y que puede ser utilizado junto con el modelo de programación por defecto.
- Blog post en el MEF Primitives (que se utilizan para crear modelos de programación).
- Blog post con un poco ideas sobre cómo un modelo de programación Ruby podría funcionar
- Cómo escribir un comando personalizado para Intellipad (Intellipad utiliza MEF y un modelo de programación Python)
Otros consejos
Sé que esto es viejo, pero se puede ver en http://github.com/JogoShugh/IronPythonMef o buscar el paquete NuGet.
Me puse algo de código de un proyecto llamado ILoveLucene por Bruno Lopes, y lo convirtió en este repo independiente y paquete. Se acaba de empezar, pero tiene algunos ejemplos incluidos, y las pruebas unitarias.
Este es un ejemplo:
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Primitives;
using System.Reflection;
using IronPython.Hosting;
using IronPythonMef;
public interface IMessenger
{
string GetMessage();
}
public interface IConfig
{
string Intro { get; }
}
/// <summary>
/// Gets exported from IronPython into the CLR Demo instance.
/// </summary>
public static class PythonScript
{
public static readonly string Code =
@"
@export(IMessenger)
class PythonMessenger(IMessenger):
def GetMessage(self):
return self.config.Intro + ' from IronPython'
@import_one(IConfig)
def import_config(self, config):
self.config = config
";
}
/// <summary>
/// Also gets exported into the Demo instance.
/// </summary>
[Export(typeof(IMessenger))]
public class ClrMessenger : IMessenger
{
[Import(typeof(IConfig))]
public IConfig Config { get; set; }
public string GetMessage()
{
return Config.Intro + " from C#!";
}
}
/// <summary>
/// This will get imported into both the IronPython class and ClrMessenger.
/// </summary>
[Export(typeof(IConfig))]
public class Config : IConfig
{
public string Intro
{
get { return "Hello"; }
}
}
public class Demo
{
[ImportMany(typeof(IMessenger))]
public IEnumerable<IMessenger> Messengers { get; set; }
public Demo()
{
// Create IronPython
var engine = Python.CreateEngine();
var script = engine.CreateScriptSourceFromString(PythonScript.Code);
// Configure the engine with types
var typesYouWantPythonToHaveAccessTo = new[] { typeof(IMessenger), typeof(IConfig) };
var typeExtractor = new ExtractTypesFromScript(engine);
var exports = typeExtractor.GetPartsFromScript(script,
typesYouWantPythonToHaveAccessTo);
// Compose with MEF
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
var batch = new CompositionBatch(exports, new ComposablePart[] { });
container.Compose(batch);
container.SatisfyImportsOnce(this);
}
public static void Main(string[] args)
{
var demo = new Demo();
foreach (var messenger in demo.Messengers)
{
Console.WriteLine(messenger.GetMessage());
}
Console.Read();
}
}
La salida es simplemente:
Hello from IronPython!
Hello from C#!