C# Unity无法解析基本依赖链
我正在Unity IoC中实现程序集的动态加载和注册 鉴于这些类别:C# Unity无法解析基本依赖链,c#,unity-container,ioc-container,C#,Unity Container,Ioc Container,我正在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 =
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
其他信息:依赖项解析失败,类型=
“MyAsm.IC”,name=“(无)”
解析时发生异常
异常为:InvalidOperationException-类型IC没有
可访问构造函数
发生异常时,容器为: MyAsm.IC,(无) 以上所有代码都在同一程序集MyAsm中执行。通过分析调试中的容器,
Registrations
属性列出了A
、B
和C
到各自接口以及自身的映射的正确集合
有什么想法吗
解决方案
泰勒的回答之后,我改变了:
var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
到
解决了这个问题。
Assembly
上的这两个方法具有相同的参数和相同的返回类型纯邪恶我能够重现您所遇到的错误
因此,您正在从文件assembly.LoadFile(@“path\MyAsm.dll”)加载程序集代码>,然后解析一个硬引用类型容器代码>。我相信这些类型来自两个不同的编译二进制文件。@“path\MyAsm.dll”中二进制文件的类型已加载到容器中,但您正在尝试从应用程序路径的bin目录解析二进制文件的类型(引用的程序集CopyLocal设置为True)
您需要注册应用程序域中已加载的引用二进制文件中的类型,或者需要使用反射从加载的二进制文件中解析类型以查找类型
var assembly = AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(asm => asm.GetName().Name == "MyAsm");
...
var c = container.Resolve(typeof(IC));
--或--
你也可以试试这个
Debug -> Windows -> Exception Settings
取消选中“公共语言运行时异常”,然后重试。我是如何通过在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>
给这个人一杯啤酒。一旦你知道了这个问题,实际的解决方案就更容易了(见Q)…哇,我没有意识到这种微妙的区别。谢谢你!
Debug -> Windows -> Exception Settings
<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>