【问题标题】:How do you use ExportFactory<T>你如何使用 ExportFactory<T>
【发布时间】:2012-07-14 23:54:39
【问题描述】:

我是 MEF 的新手,正在尝试使用 ExportFactory。我可以使用 ExportFactory 根据用户插入的对象创建列表吗?示例将类似于下面显示的内容。我可能不了解 ExportFactory 的使用,因为在运行时我在合成过程中收到如下所示的错误。

1) 没有找到与约束匹配的有效导出 '((exportDefinition.ContractName == “System.ComponentModel.Composition.ExportFactory(CommonLibrary.IFoo)”) AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") 并且 "System.ComponentModel.Composition.ExportFactory(CommonLibrary.IFoo)".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))', 无效的导出可能已被拒绝。

 class Program
{
    static void Main(string[] args)
    {
        Test mytest = new Test();
    }
}

public class Test : IPartImportsSatisfiedNotification
{
    [Import]
    private ExportFactory<IFoo> FooFactory { get; set; }

    public Test()
    {
        CompositionInitializer.SatisfyImports(this);
        CreateComponent("Amp");
        CreateComponent("Passive");
    }

    public void OnImportsSatisfied()
    {
        int i = 0;
    }

    public void CreateComponent(string name)
    {
        var componentExport = FooFactory.CreateExport();
        var comp = componentExport.Value;
    }
}

public interface IFoo
{
    double Name { get; set; }
}

[ExportMetadata("CompType", "Foo1")]
[Export(typeof(IFoo))]
[PartCreationPolicy(System.ComponentModel.Composition.CreationPolicy.NonShared)]
public class Foo1 : IFoo
{
    public double Name { get; set; }
    public Foo1()
    {

    }
}

[ExportMetadata("CompType", "Foo2")]
[Export(typeof(IFoo))]
[PartCreationPolicy(System.ComponentModel.Composition.CreationPolicy.NonShared)]
public class Foo2 : IFoo
{
    public double Name { get; set; }
    public Foo2()
    {
    }
}

【问题讨论】:

  • 您实际上并没有在测试类中显示导入,因此很难判断它们有什么问题。请编辑您的问题。
  • 我刚刚编辑了之前的源代码以现在显示导入

标签: c# mef


【解决方案1】:

问题似乎是您希望导入单个ExportFactory&lt;IFoo&gt;,但您导出了两个不同的IFoo 实现。在您的示例中,MEF 无法在两种实现之间做出决定。

您可能想要导入多个工厂,包括这样的元数据:

[ImportMany]
private IEnumerable<ExportFactory<IFoo,IFooMeta>> FooFactories 
{ 
    get;
    set;
}

IFooMeta 会这样声明:

public interface IFooMeta
{
    string CompType { get; }
}

然后你可以像这样实现CreateComponent:

public IFoo CreateComponent(string name, string compType)
{
    var matchingFactory = FooFactories.FirstOrDefault(
        x => x.Metadata.CompType == compType);
    if (matchingFactory == null)
    {
        throw new ArgumentException(
            string.Format("'{0}' is not a known compType", compType),
            "compType");
    }
    else
    {
        IFoo foo = matchingFactory.CreateExport().Value;
        foo.Name = name;
        return foo;
    }
}

【讨论】:

  • 我在使用 ExportFactory 时仍然遇到问题。我需要将 [Import] 更改为 [ImportMany] 吗?使用 [Import] 创建容器时出现错误。当我将其更改为 [ImportMany] 时,容器已构建,但现在 CreateComponent 方法显示没有“Foo1”。
  • 维姆,感谢您的帮助!我解决了我的问题。
  • 我确实打算写[ImportMany],现在已经修好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
相关资源
最近更新 更多