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
具有相同的参数和相同的返回类型,并且在行为上略有不同.纯粹的邪恶.
我能够重现你得到的错误.
因此,您要从文件加载程序集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)
归档时间: |
|
查看次数: |
21456 次 |
最近记录: |