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

时间:2014-03-03 23:06:40

标签: 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 = 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属性列出了ABC到各自接口以及它们自身的映射的正确集合。< / p>

有什么想法吗?

在Tyler回应后我改变了:

var assembly = Assembly.LoadFile(@"path\MyAsm.dll");

var assembly = Assembly.LoadFrom(@"path\MyAsm.dll");

解决了这个问题。 Assembly上的这两个方法具有相同的参数和相同的返回类型以及vary just slightly in behavior纯粹的邪恶

3 个答案:

答案 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>