如何使用 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 文件都放在主程序的输出文件夹中。
我正在尝试实施控制反转 (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 文件都放在主程序的输出文件夹中。