Como usar DLR com MEF em .Net 4.0?
-
21-08-2019 - |
Pergunta
Houve promessas da equipe MEF que MEF apoiarão plugins DLR no .NET 4.0. Será que ele já acontecer e eu posso [Import] alguns IronPython objetos?
Se sim, todos os links para o tópico seria útil.
Solução
O modelo de programação padrão não suporta o DLR, mas outros modelos de programação pode ser escrito que irá apoiá-lo, e que pode ser utilizado em conjunto com o modelo de programação padrão.
- post sobre os primitivos MEF (que são usados ??para criar modelos de programação).
- blog com alguns idéias sobre como um modelo de programação ruby ??poderia trabalhar
- Como escrever um comando personalizado para IntelliPad (IntelliPad usa MEF e um modelo de programação python)
Outras dicas
Eu sei que este é antiga, mas você pode olhar para http://github.com/JogoShugh/IronPythonMef ou olhar para o pacote NuGet.
Eu puxei algum código de um projeto chamado ILoveLucene por Bruno Lopes, e transformou-o em este repo independente e pacote. Ele está apenas começando, mas tem alguns exemplos incluídos, e testes de unidade.
Aqui está um exemplo:
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();
}
}
A saída é simplesmente:
Hello from IronPython!
Hello from C#!