如何从.net core 2.1中的另一个程序集中加载MEF组件

时间:2018-11-01 15:29:37

标签: c# .net-core mef

我只是在MEF领域迈出了第一步,并希望使用.net core 2.1。

使用VS 2017(版本15.8.8),我已经完成了带有界面的小型控制台应用程序(.NET Core)

interface IMessageSender
{
    void Send(string message);
}

和一个实现(在同一项目中)

[Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
    public void Send(string message)
    {
        Console.WriteLine("EmailSender : " + message);
    }
}

最后,我从Main(string [] args)执行了一个小的compose方法

    [Import]
    private void Compose()
    {
        var assembly_A = new[] { typeof(Program).GetTypeInfo().Assembly };
        var config_A = new ContainerConfiguration().WithAssembly(assembly_A[0]);
        var container_A = config_A.CreateContainer();
        var msg_A = container_A.GetExport<IMessageSender>();
        msg_A.Send("Hello");
    }

它按预期工作

enter image description here

但是,如果我在解决方案中添加新的类库并将Send(string)的实现移动到新添加的项目中,则无法进行。

namespace AnotherMefExtensionProjectNamespace
{
  [Export(typeof(IMessageSender))]
  public class EmailSenderExtended : IMessageSender
  {
    public void Send(string message)
    {
        Console.WriteLine("EmailSenderExtended : " + message);
    }
  }
}

新的撰写方法

    [Import]
    public IMessageSender MessageSender { get; set; }
    private void Compose()
    {
        var assembly_B = new[] { typeof(EmailSenderExtended).GetTypeInfo().Assembly };
        var config_B = new ContainerConfiguration().WithAssembly(assembly_B[0]);
        var container_B = config_B.CreateContainer();
        var msg_B = container_B.GetExport<IMessageSender>();
        msg_B.Send("Hello");
    }

enter image description here

我试图比较不同的配置和容器(示例中的_A与_B),但无法理解有什么不同。我什至试图扩展类ContainerConfiguration以便从指定的程序集中加载,只要给定文件包含Main方法,它就可以工作,但是如果我使用“扩展的” .NET Core类库,则失败。

        public static ContainerConfiguration WithChosenAssembly(this ContainerConfiguration configuration, string pathAndFile)
    {
        var context = AssemblyLoadContext.Default.LoadFromAssemblyPath(pathAndFile);
        var ass_list = new List<Assembly>() { context };
        configuration = configuration.WithAssemblies(ass_list, null);
        return configuration;
    }

给我的印象是,您通过开发基本实现指定接口的类库来扩展主应用程序。 我目前似乎无法执行此操作,但显然我误解了一些非常基本的内容。

如果有人愿意让我走上正确的道路,或者给我一个替代的想法,以开发.net core的“插件”,我将不胜感激。

国王的问候 马格努斯

1 个答案:

答案 0 :(得分:0)

我意识到我的测试设置无法模拟任何现实情况,因此我将自己的问题带给了我。

显然我应该有三个项目。

  1. 一个只有接口定义的项目。
  2. 一个所有我的常规代码都存在的“主”项目。
  3. 存在我的接口的MEF实现的一个(或多个)项目。

审阅我的示例并坚持上面显而易见的“设计”,所有这些都完全可以正常工作。 大多数StackOverflow用户可能不会误入歧途,但对于那些这样做的用户,希望以上内容对您有所帮助。 :-)