我正在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));
抛出:
类型的第一次机会异常 发生了'Microsoft.Practices.Unity.ResolutionFailedException' Microsoft.Practices.Unity.dll
其他信息:依赖项的解析失败,type = “MyAsm.IC”,name =“(none)”。
在解析时发生异常。
异常是:InvalidOperationException - 类型IC没有 可访问的构造函数。
在例外时,容器是:
MyAsm.IC,(无)
以上所有代码都在同一个程序集MyAsm中执行。在调试中分析容器时,Registrations
属性列出了A
,B
和C
到各自接口以及它们自身的映射的正确集合。< / p>
有什么想法吗?
解
在Tyler回应后我改变了:
var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
到
var assembly = Assembly.LoadFrom(@"path\MyAsm.dll");
解决了这个问题。 Assembly
上的这两个方法具有相同的参数和相同的返回类型以及vary just slightly in behavior。 纯粹的邪恶。
答案 0 :(得分:5)
我能够重现你得到的错误。
因此,您要从文件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"));
答案 1 :(得分:1)
你也可以试试这个。
Debug -> Windows -> Exception Settings
取消选中&#34;公共语言运行时例外&#34;然后再试一次。
答案 2 :(得分:0)
我是如何通过在unity.config
上映射接口和存储库来解决它的<alias alias="IUserRepository" type="pHAB.Repository.Contract.IUserRepository, pHAB.Repository" />
<alias alias="UserRepository" type="pHAB.Repository.UserRepository, pHAB.Repository" />
<container>
<register type="IUserRepository" mapTo="UserRepository"/>
</container>