簡體   English   中英

如何從.net core 2.1中的另一個程序集中加載MEF組件

[英]How to load a MEF component from another assembly in .net core 2.1

我只是在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");
    }

它按預期工作

在此處輸入圖片說明

但是,如果我在解決方案中添加新的類庫,並將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");
    }

在此處輸入圖片說明

我試圖比較不同的配置和容器(示例中的_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. 一個只有接口定義的項目。
  2. 我所有的常規代碼都存在的一個“主”項目。
  3. 我的接口的MEF實現存在的一個(或多個)項目。

回顧我的示例並堅持上面顯而易見的“設計”,所有這些工作均應按預期進行。 大多數StackOverflow用戶可能不會誤入歧途,但對於那些這樣做的用戶,希望以上內容對您有所幫助。 :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM