Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity无法解析基本依赖链_C#_Unity Container_Ioc Container - Fatal编程技术网

C# Unity无法解析基本依赖链

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 =

我正在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

其他信息:依赖项解析失败,类型= “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>