我们当前正在使用一个大型解决方案,其中包含WCF项目(.NET Framework 4.7.2)和多个.NET Standard 2.0库。
我们正在尝试向Unity(DI)注册这些库。将库加载到容器中可以正常工作。但是,在构造函数中解析这些类失败。
Unity.Exceptions.ResolutionFailedException: 'Resolution of the dependency
failed, type = 'PROJECTNAME.Service.ITypeDependentonDbContext', name = '(none)'.
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type,
PROJECTNAME.DAL.Repositories.Interfaces.IDbContext, is an interface
and cannot be constructed. Are you missing a type mapping?
更具体地说,每个库都有一个ModuleInit类,在该类中,我们在ModuleRegistrar(用于MEF2)上注册类型,如下所示:
public void Initialize(IModuleRegistrar registrar)
{
registrar.RegisterType<IDbContext, DbContext>();
// etc
}
然后,在我们的.NET Framework项目中,我们将类型注册到Unity容器:
protected override void ConfigureContainer(IUnityContainer container)
{
container
.RegisterType<ISomeService, SomeService>()
.RegisterType<ITypeDependentonDbContext, TypeDependentonDbContext>();
//etc
ModuleLoader.LoadContainer(container, ".\\bin", "*.*.dll");
}
最后,在.NET Framework项目的一个类中,我们有
public class SomeService : ISomeService
{
private readonly ITypeDependentonDbContext _typeDependentonDbContext;
/// <summary>
/// constructor
/// </summary>
/// <param name="typeDependentonDbContext"></param>
public SomeService(ITypeDependentonDbContext typeDependentonDbContext)
{
_typeDependentonDbContext = typeDependentonDbContext ?? throw new ArgumentNullException(nameof(typeDependentonDbContext));
}
}
奇怪的是,如果我们直接在容器中注册所有依赖的类型,则不会引发异常。这与现有的.NET框架解决方案形成了鲜明对比,在现有的.NET框架解决方案中,我们在该项目的moduleInit类中注册了每种类型,与此处介绍的完全相同。但是,这似乎不适用于.NET标准2.0项目。
此外,在调试时,似乎似乎已经在容器中很好地注册了类-每个接口都映射到正确的实现类。只有当我们实际上希望解决构造函数中的依赖关系时,事情才似乎出错了。
有人对为什么会发生这种情况有任何想法吗?