尝试实施MEF。找不到方法

时间:2019-07-18 16:32:15

标签: null mef

请让我看看代码。 我无法获得任何外部方法。 “操作”始终为空 “目录”是可以的-我看到它可以看到其中的所有Dll和方法。 “ AvailableNumberOfOperations”始终为0

public interface IOperation
{
    string Render(string parameters);
}
public class Extensions
{
    [ImportMany(typeof(IOperation))]
    private IEnumerable<Lazy<IOperation>> operations;

    private CompositionContainer _container;

    public int AvailableNumberOfOperations
    {
        get { return operations != null ? operations.Count() : 0; }
    }

    public string RenderModule(string moduleName, string args)
    {
        var result = "";
        if (AvailableNumberOfOperations != 0)
        {
            foreach (Lazy<IOperation> com in operations)
            {
                result = com.Value.Render(args);
            }
        }

        return result;
    }
    public void LoadModules()
    {
        // called first !!
        var catalog = new AggregateCatalog();

        string path = HttpContext.Current.Server.MapPath("~/App_Data/Extensions/");
        catalog.Catalogs.Add(new DirectoryCatalog(path));

        _container = new CompositionContainer(catalog);

        try
        {
            _container.ComposeParts();
        }
        catch (CompositionException compositionException)
        {
            Console.WriteLine(compositionException.ToString());
        }
    }

    [Export(typeof(OnePlace.IOperation))]
    [ExportMetadata("ModuleName", "HelloWorld")]
    public class HelloWorld : IOperation
    {
        public string Render(string parameters)
        {
            return "Hello World";
        }
    }

    [Export(typeof(OnePlace.IOperation))]
    [ExportMetadata("ModuleName", "SeeYouWorld")]
    public class SeeYouWorld : IOperation
    {
        public string Render(string parameters)
        {
            return "See You World";
        }
    }
}

外部DLL就是这样的。 我在主添加中有两种方法,一种在外部dll中 我必须编写所有这些注释才能插入所有代码。抱歉。 如果您能向我解释我的错误在哪里,这将非常有帮助-谢谢!我以前从未使用过MEF。

namespace SimpleMenu
{
  [Export(typeof(OnePlace.IOperation))]
  [ExportMetadata("ModuleName", "Menu")]
  public class Menu : OnePlace.IOperation
  {
    public string Render(string parameters)
    {
        return "menu 13";
    }
  }
}

enter image description here

1 个答案:

答案 0 :(得分:0)

您的Extensions实例似乎是在MEF外部创建的,因此CompositionContainer不知道有任何要满足的输入。

您可以通过以下方法解决此问题: _container.SatisfyImportsOnce(this)

    public void LoadModules()
    {
        // called first !!
        var catalog = new AggregateCatalog();

        string path = HttpContext.Current.Server.MapPath("~/App_Data/Extensions/");
        catalog.Catalogs.Add(new DirectoryCatalog(path));

        _container = new CompositionContainer(catalog);

        try
        {
            _container.ComposeParts();
            _container.SatisfyImportsOnce(this);
        }
        catch (CompositionException compositionException)
        {
            Console.WriteLine(compositionException.ToString());
        }
    }

看到类似的答案: SatisfyImportsOnce vs ComposeParts