在.NET 4.7.2中使用统一(DI)解决.net标准2.0

时间:2018-12-03 14:37:29

标签: c# wcf dependency-injection unity-container .net-standard-2.0

我们当前正在使用一个大型解决方案,其中包含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项目。

此外,在调试时,似乎似乎已经在容器中很好地注册了类-每个接口都映射到正确的实现类。只有当我们实际上希望解决构造函数中的依赖关系时,事情才似乎出错了。

有人对为什么会发生这种情况有任何想法吗?

0 个答案:

没有答案