如何使用 IoC 将函数传递给另一个 class

How to pass a function to another class using IoC

我正在尝试实施控制反转 (IoC) 以开发基于插件的应用程序,该应用程序需要能够在发生某些事情时将数据(例如字符串)传回我的主 EXE。为实现这一点,我将 Action 传递给 DLL,它可用于将数据发送回 EXE。以下代码显示了一个小测试应用程序来解释我的初学者问题:

namespace MainExe
{
    class Program
    {
        [Import(typeof(IDataProvider))]
        public IDataProvider stringProvider { get; set; }

        public void myCallback(string str)
        {
            Console.WriteLine(str);
        }

        public Program()
        {
            try
            {
                AggregateCatalog aggregatecatalogue = new AggregateCatalog();
                aggregatecatalogue.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));
                CompositionContainer container = new CompositionContainer(aggregatecatalogue);
                container.ComposeParts(this);    
            }
            catch (FileNotFoundException fnfex)
            {
                Console.WriteLine(fnfex.Message);
            }
            catch (CompositionException cex)
            {
                Console.WriteLine(cex.Message);
            }
        }

        void Run()
        {
            if (stringProvider != null)
            {
                stringProvider.SaySomething("myrequest", myCallback);
                Console.ReadKey();
            }
        }

        static void Main(string[] args)
        {
            Program program = new Program();
            program.Run();
        }
    }
}

我的界面是这样的:

namespace DataInterfaceDll
{
    public interface IDataProvider
    {
        void SaySomething(string request, Action<string> callback);
    }
}

这是插件 (DLL),它应该能够将某些内容发送回 EXE(或从执行此操作的 EXE 调用函数):

namespace StringDataDll
{
    [Export(typeof(IDataProvider))]
    public class StringData : IDataProvider
    {
        public void SaySomething(string request, Action<string> callback)
        {
            callback("This is just a test program...");
        }
    }
}

当我运行这段代码时,我在下面的行

中得到一个System.Reflection.ReflectionTypeLoadException
container.ComposeParts(this);

谁能告诉我我做错了什么?

它通过动态加载 DLL 为我工作。

aggregatecatalogue.Catalogs.Add(new AssemblyCatalog(Assembly.LoadFile("yourpath\StringDataDll.dll")));
aggregatecatalogue.Catalogs.Add(new AssemblyCatalog(Assembly.GetAssembly(typeof(IDataProvider))));

当您在主程序的输出文件夹中复制 stringDataDll.dll 时,它也适用于 new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)

确保将所有 dll 文件都放在主程序的输出文件夹中。