Wie DLR mit MEF in .NET 4.0 zu benutzen?
-
21-08-2019 - |
Frage
Es gab Versprechen aus dem MEF-Team, das MEF wird die DLR-Plugins im .Net 4.0. Hat es schon passieren, und ich kann [Import] einige Objekte Ironpython?
Wenn ja, werden alle Links zum Thema wäre hilfreich.
Lösung
Das Standardprogrammiermodell unterstützt nicht das DLR, aber auch andere Programmiermodelle geschrieben werden können, die es unterstützen werden, und das kann zusammen mit dem Standard-Programmiermodell verwendet werden.
- Blog-Post auf der MEF Primitives (die verwendet werden, Programmiermodelle erstellen).
- Blog Post mit einigen Ideen, wie ein Modell Ruby-Programmierung arbeitet könnte
- Wie schreiben einen benutzerdefinierten Befehl für IntelliPad (IntelliPad verwendet MEF und ein python-Programmiermodell)
Andere Tipps
Ich weiß, das alt ist, aber man kann sehen http://github.com/JogoShugh/IronPythonMef oder suchen Sie nach dem NuGet Paket.
zog ich einige Codes aus einem Projekt ILoveLucene von Bruno Lopes genannt, und verwandeln sie in dieses unabhängigen Repo- und Paket. Es ist gerade erst begonnen, hat aber einige Beispiele enthalten und Unit-Tests.
Hier ist ein Beispiel:
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();
}
}
Der Ausgang ist einfach:
Hello from IronPython!
Hello from C#!