Unity无法解决基本依赖关系链

Jac*_*goń 9 c# ioc-container unity-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) { }
}
Run Code Online (Sandbox Code Playgroud)

而这个配置:

var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
container.RegisterTypes(
    AllClasses.FromAssemblies(assembly),
    WithMappings.FromAllInterfacesInSameAssembly,
    WithName.Default,
    WithLifetime.Transient);
Run Code Online (Sandbox Code Playgroud)

代码:

var c = container.Resolve(typeof(IC));
Run Code Online (Sandbox Code Playgroud)

抛出:

Microsoft.Practices.Unity.dll中出现"Microsoft.Practices.Unity.ResolutionFailedException"类型的第一次机会异常

附加信息:依赖项的解析失败,type ="MyAsm.IC",name ="(none)".

在解决时发生异常:

例外情况是:InvalidOperationException - 类型IC没有可访问的构造函数.


在例外时,容器是:

MyAsm.IC,(无)

所有上述代码都在同一个程序集MyAsm中执行.在调试中分析容器,该Registrations属性列出了似乎正确的映射集合A,B以及C它们各自的接口以及它们自己.

有任何想法吗?

在Tyler的回应之后我改变了:

var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
Run Code Online (Sandbox Code Playgroud)

var assembly = Assembly.LoadFrom(@"path\MyAsm.dll");
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题.这两个方法Assembly具有相同的参数和相同的返回类型,并且在行为上略有不同.纯粹的邪恶.

Tyl*_*sen 5

我能够重现你得到的错误.

因此,您要从文件加载程序集Assembly.LoadFile(@"path\MyAsm.dll");,然后解析硬引用类型container.Resolve(typeof(IC));.我相信这些类型来自两个不同的编译二进制文件.来自@"path\MyAsm.dll"中二进制文件的类型被加载到容器中,但您正在尝试从应用程序路径的bin目录中解析二进制文件的类型(Referenced assembly CopyLocal设置为True).

您需要从已在应用程序域中加载的引用二进制文件中注册类型,或者您需要使用反射从已加载的二进制文件中解析类型以查找类型.

var assembly = AppDomain.CurrentDomain.GetAssemblies().
               SingleOrDefault(asm => asm.GetName().Name == "MyAsm");
...
var c = container.Resolve(typeof(IC));
Run Code Online (Sandbox Code Playgroud)

- 要么 -

var assembly = Assembly.LoadFile(@"path\MyAsm.dll");
...
var c = container.Resolve(assembly.GetType("MyAsm.IC"));
Run Code Online (Sandbox Code Playgroud)