Как использовать DLR с MEF в .Net 4.0?

Команда MEF пообещала, что MEF будет поддерживать подключаемые модули DLR в .Net 4.0. Это уже произошло, и я могу [импортировать] некоторые объекты IronPython?

Если да, то любые ссылки на тему будут полезны.


person Sergey Aldoukhov    schedule 01.07.2009    source источник


Ответы (2)


Модель программирования по умолчанию не поддерживает DLR, но можно написать другие модели программирования, которые будут ее поддерживать и которые можно использовать вместе с моделью программирования по умолчанию.

person Daniel Plaisted    schedule 02.07.2009

Я знаю, что это устарело, но вы можете посмотреть на http://github.com/JogoShugh/IronPythonMef или найдите пакет NuGet.

Я вытащил некоторый код из проекта под названием ILoveLucene Бруно Лопеса и превратил его в этот независимый репозиторий и пакет. Это только начало, но уже включены некоторые примеры и модульные тесты.

Вот пример:

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();
    }
}

Вывод просто:

Hello from IronPython!
Hello from C#!
person JoshGough    schedule 13.11.2012