我正在Unity IoC中实现程序集的动态加载和注册。
给定这些类:
public interface IA { }
public interface IB { }
public interface IC { }
public class A : IA { }
public class B : IB
{
public B(IA a) { }
}
public class C : IC
{
public C(IB b) { }
}
而这个配置:
var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
container.RegisterTypes(
AllClasses.FromAssemblies(assembly),
WithMappings.FromAllInterfacesInSameAssembly,
WithName.Default,
WithLifetime.Transient);
编码:
var c = container.Resolve(typeof(IC));
抛出:
以上所有代码均在同一程序集MyAsm中执行。在调试中分析容器时,
Registrations
属性列出了A
,B
和C
到它们各自的接口(interface)以及它们自己的映射的正确集合。有任何想法吗?
解决方案
在泰勒的回应之后,我改变了:
var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
至
var assembly = Assembly.LoadFrom(@"path\MyAsm.dll");
解决了这个问题。
Assembly
上的这两种方法具有相同的参数,相同的返回类型和vary just slightly in behavior。 纯邪恶的。 最佳答案
我能够重现您遇到的错误。
因此,您要从文件Assembly.LoadFile(@"path\MyAsm.dll");
加载程序集,然后要解析一个硬引用的container.Resolve(typeof(IC));
类型。我相信这些类型来自两个不同的编译二进制文件。 @“path\MyAsm.dll”中二进制文件的类型已加载到容器中,但是您试图从应用程序路径的bin目录中解析二进制文件的类型(引用程序集CopyLocal设置为True)。
您需要从已经在应用程序域中加载的引用二进制文件中注册类型,或者需要使用反射来从加载的二进制文件中解析类型以查找类型。
var assembly = AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(asm => asm.GetName().Name == "MyAsm");
...
var c = container.Resolve(typeof(IC));
- 或者 -
var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
...
var c = container.Resolve(assembly.GetType("MyAsm.IC"));