我正在开发一个组件,该组件执行向 ioc 注册的任何接口(interface)的临时方法,并且执行时刻取决于不同的触发器。它必须能够将要执行的操作保存到数据库中,因此我将方法名称、类型和参数列表(序列化为 BLOB)保存到数据库中,直到需要为止。

当触发发生时,我需要在类型的实例上执行方法。当我使用依赖注入(inject)时,我将接口(interface)名称保存到数据库中(格式为 "Namespace.IInterface, AssemblyName" )

要在 ioc 容器上运行 Resolve<IInterface>() 方法,我需要其 Type 的实例:

Assembly assembly = System.Reflection.Assembly.Load(assemblyName);
Type service = assembly.GetType(typeName);
object instance = IOCContainer.Resolve(service);

我的问题是:
  • 是否有更好的方法从其名称中获取 Type 的实例,如果
    我确定包含程序集已加载到应用程序域中? (我简单地尝试使用 Type.Load(typeName) 但得到了 null)
  • 如果有问题的程序集已加载,CLR 会优化该过程(使用已加载的),还是我需要手动缓存程序集列表以防止反复加载相同程序集对性能的影响?
  • 最佳答案

  • 如果您使用的 typeName 包含程序集名称(类似于 MyNamespace.MyType, MyAssembly version=1.0.0.0,publicKeyToken=12345etc ),那么 Type.Load(typeName) 将获取您的类型但不为空;
  • CLR 只负责加载程序集一次(每个上下文一次, details is here ,在您的情况下,上下文保持不变,所以答案是您应该放松并将缓存留给 CLR :))。
  • 关于c# - Assembly.Load 性能影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12261447/

    10-13 06:08