MEF将模块添加两次到目录

时间:2013-06-13 12:51:49

标签: module mef catalog

您是否知道如何将同一模块两次添加到具有不同参数的目录中?

ITest acc1 = new smalltest("a", 0)
ITest acc2 = new smalltest("b", 1)

AggregateCatalog.Catalogs.Add(??)
AggregateCatalog.Catalogs.Add(??)

提前致谢!

1 个答案:

答案 0 :(得分:0)

由于MEF仅限于使用属性,并且可以使用导入和导出属性进行配置,这与IoC容器通常提供的灵活性不同,只是如何在MEF中扩展Part,可以扩展它从引用的DLL中,您也可以通过创建一个使用[ExportAttribute]公开某些属性的类,从类中继承先前的MEF Part。该属性不限于类的用法,但可以应用于属性。例如,这样的事情怎么样。

public class PartsToExport
{
    [Export(typeof(ITest))]
    public Implementation A
    {
        get { return new Implementation("A", 5); }
    }

    [Export(typeof(ITest))]
    public Implementation B
    {
        get { return new Implementation("B", 10); }
    }
}

public interface ITest
{
    void WhoAmI(Action<string, int> action);
}

[Export]
public class Implementation : ITest
{
    private string _method;
    private readonly int _value;

    public Implementation(string method, int value)
    {
        _method = method;
        _value = value;
    }

    public void WhoAmI(Action<string, int> action)
    {
        action(_method, _value);
    }
}

[TestClass]
public class Tests
{
    [TestMethod]
    public void Test()
    {
        var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
        CompositionContainer container = new CompositionContainer(catalog);

        var tests = container.GetExportedValues<ITest>();

        foreach (var test in tests)
        {
            test.WhoAmI((s, i) => Console.WriteLine("I am {0} with a value of {1}.", s, i));
        }
    }
}

这将以下内容输出到控制台:

我是A,其值为5.
我是B,价值10。