繁体   English   中英

为什么Unity在解析类时无法选择String构造函数?

[英]Why does Unity fail to select a String constructor when resolving class?

我已经在之前运行良好的 (.NET 4.5.2) 项目中将 Unity 从 v4.0.1 升级到 v5.11.3,但自从我升级后,我收到以下异常: Resolution failed with error: Failed to select a constructor for System.String

我试图解析的类有一个 String 构造函数,我已经用一个InjectionConstructor注册了它。 见下面的代码:

// Multiple IDbContext registrations happen when the application is initialized
container.RegisterType<IDbContext, AuthenticationContext>(typeof(AuthenticationContext).ToString(), new InjectionConstructor(AppConstants.DatabaseKey));
container.RegisterType<IDbContext, ApplicationContext>(typeof(ApplicationContext).ToString(), new InjectionConstructor(AppConstants.DatabaseKey));

public class DbContextFactory : IDbContextFactory
{
   private readonly IUnityContainer _container;

   public DbContextFactory(IUnityContainer container)
   {
      _container = container;
   }

   public IDbContext CreateDbContext<TDbContext>() where TDbContext : IDbContext
   {
      var key = typeof(TDbContext).ToString();
      return container.Resolve<TDbContext>(key);
   }
}

public class AuthenticationContext : DbContextWrapper
{
   public AuthenticationContext(string connectionString) : base(connectionString)
   {
   }
}

public class DbContextWrapper : IDbContext
{
   public DbContextWrapper(string connectionString)
   {
   }
}

我应该如何解释异常? 未能为 String 选择构造函数,让我认为注册成功并且它正在寻找接受 String 但找不到它的构造函数? 这很奇怪,因为我的 AuthenticationContext 只有一个构造函数接受……一个字符串!

我尝试在 dotnetfiddle 上阐明完整的代码示例,但是在初始化 UnityContainer 时,我收到了“操作可能会破坏运行时的稳定性”异常。 https://dotnetfiddle.net/xuX57K

所以我在通过container.EnableDebugDiagnostic();启用调试模式后得到的新异常消息container.EnableDebugDiagnostic(); 让我思考...它是说我必须配置容器来为构造函数提供字符串值,我确信我做到了。 所以这意味着它实际上甚至没有考虑使用我的注册。 在调试容器注册时,我看到我的注册在那里,所以这也不是问题。

然后我意识到 Unity 默认注册所有类型,因此它试图创建AuthenticationContext的实例,因此它失败了,因为当它使用隐式注册时,它不知道如何处理所需的字符串参数。

错误在DbContextFactory ,这修复了它:

public IDbContext CreateDbContext<TDbContext>() where TDbContext : IDbContext
{
   var key = typeof(TDbContext).ToString();

   // This is wrong because it is trying to resolve AuthenticationContext for a given name.
   // But it should resolve a registration for IDbContext for that name since that is
   // how it was registered!
   // return container.Resolve<TDbContext>(key);

   return container.Resolve<IDbContext>(key);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM