繁体   English   中英

使用MEF初始化ExportFactory

[英]Initializing ExportFactory using MEF

  1. 情境
    1. 应用程序包含多个部分。
    2. 每个部分位于单独的dll中,并实现IFoo接口
    3. 所有这些dll都存在于同一目录(插件)中
    4. 应用程序可以实例化每个部分的多个实例

以下是接口,零件(导出)和导入的代码段。 我遇到的问题是,“ factories”对象初始化为空列表。

但是,如果尝试使用container.Resolve(typeof(IEnumerable <IFoo>)),则确实会得到零件的对象。 但这不符合我的目的(第4点)。 有人可以在这里指出我做错了什么吗?

public interface IFoo
{
    string Name { get; }
}

public interface IFooMeta
{
    string CompType { get; }
}

在单独的Dll中实现IFoo

[ExportMetadata("CompType", "Foo1")]
[Export(typeof(IFoo)), PartCreationPolicy(CreationPolicy.NonShared)]
public class Foo1 : IFoo
{
    public string Name
    {
        get { return this.GetType().ToString(); }
    }
}

加载所有零件并根据需要实例化的主应用程序

class PartsManager
    {
        [ImportMany]
        private IEnumerable<ExportFactory<IFoo, IFooMeta>> factories;

        public PartsManager()
        {
            IContainer container = ConstructContainer();    
            factories = (IEnumerable<ExportFactory<IFoo, IFooMeta>>)
                   container.Resolve(typeof(IEnumerable<ExportFactory<IFoo, IFooMeta>>));    
        }    

        private static IContainer ConstructContainer()
        {
            var catalog = new DirectoryCatalog(@"C:\plugins\");
            var builder = new ContainerBuilder();         
            builder.RegisterComposablePartCatalog(catalog);

            return builder.Build();
        }

        public IFoo GetPart(string compType)
        {
            var matchingFactory = factories.FirstOrDefault(
                x => x.Metadata.CompType == compType);
            if (factories == null)
            {
                return null; 
            }
            else
            {
                IFoo foo = matchingFactory.CreateExport().Value;
                return foo;
            }
        }
    }

这似乎与ContainerBuilder有关。 我尝试了CompositionContainer的替代方法,但没有障碍。 粘贴代码段以获取修改后的方法。

    public PartsManager()
    {
         ConstructContainer();
    }

    private void ConstructContainer()
    {
        var catalog = new DirectoryCatalog(@"C:\plugins\");
        var container = new CompositionContainer(catalog);
        container.ComposeParts(this);
        container.SatisfyImportsOnce(this);
    }

看来这是Autofac中的一个已知问题 ,目前已通过“无法解决”的解决方案关闭。

如果从如下所示从Autofac删除依赖项,它将起作用:

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.ComponentModel.Composition;
using System.Reflection;

namespace SO24132313
{
    public interface IFoo
    {
        string Name { get; }
    }

    public interface IFooMeta
    {
        string CompType { get; }
    }

    [ExportMetadata("CompType", "Foo1")]
    [Export(typeof(IFoo)), PartCreationPolicy(CreationPolicy.NonShared)]
    public class Foo1 : IFoo
    {
        public string Name
        {
            get { return GetType().ToString(); }
        }
    }


    class PartsManager
    {
        [ImportMany]
        private IEnumerable<ExportFactory<IFoo, IFooMeta>> factories;

        public PartsManager()
        {
            ConstructContainer(this);
        }

        private static void ConstructContainer(PartsManager p)
        {
            var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
            var c = new CompositionContainer(catalog);
            c.ComposeParts(p);
        }

        public IFoo GetPart(string compType)
        {
            var matchingFactory = factories.FirstOrDefault(
                x => x.Metadata.CompType == compType);
            if (factories == null)
            {
                return null;
            }
            else
            {
                IFoo foo = matchingFactory.CreateExport().Value;
                return foo;
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            PartsManager a = new PartsManager();
            IFoo bla = a.GetPart("Foo1");
            Console.WriteLine(bla);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM