类型 X 有多个长度为 1 的构造函数。无法消除歧义
The type X has multiple constructors of length 1. Unable to disambiguate
我正在 ASP.NET Webforms 项目中工作,使用 Unity 进行 DI。
本项目同样使用DevExpress ASP.NET Ajax控件。
现在我们遇到了 运行 问题,这似乎是 DevExpress 和 Unity 之间的冲突。
这是 Unity 配置
[assembly: WebActivator.PostApplicationStartMethod(typeof(Sales.Web.App_Start.UnityWebFormsStart), "PostStart")]
namespace Sales.Web.App_Start
{
/// <summary>
/// Startup class for the Unity.WebForms NuGet package.
/// </summary>
internal static class UnityWebFormsStart
{
/// <summary>
/// Initializes the unity container when the application starts up.
/// </summary>
/// <remarks>
/// Do not edit this method. Perform any modifications in the
/// <see cref="RegisterDependencies" /> method.
/// </remarks>
internal static void PostStart()
{
IUnityContainer container = new UnityContainer();
HttpContext.Current.Application.SetContainer(container);
RegisterDependencies(container);
}
/// <summary>
/// Registers dependencies in the supplied container.
/// </summary>
/// <param name="container">Instance of the container to populate.</param>
private static void RegisterDependencies(IUnityContainer container)
{
// TODO: Add any dependencies needed here
container
.RegisterType<IDbFactory, DbFactory>(new HierarchicalLifetimeManager())
.RegisterType(typeof(IDbProxy<>), typeof(DbProxy<>))
.RegisterType<IErpData, ErpData>(new HierarchicalLifetimeManager())
.RegisterType<ICaseData, CaseData>(new HierarchicalLifetimeManager())
.RegisterType<ICaseCauseData, CaseCauseData>(new HierarchicalLifetimeManager())
.RegisterType<ICaseHandler, CaseHandler>(new HierarchicalLifetimeManager());
}
}
}
任何此 Unity 配置都与 DevExpress 控件无关,但我认为它连接了 HttpContext 对象。
只有当我使用 DevExpress 的 TabControl 时才会出现此错误,所有其他控件都可以正常工作。
请参阅更详细地描述错误消息的附图。
按照惯例,如果没有提供其他配置,Unity 会优先使用具有最长参数列表的构造函数。具有两个参数列表长度相等的构造函数会产生歧义,因此 Unity 会抛出异常。这就是它无法解析您正在使用的控件的原因。
您可以明确告诉 Unity 首选哪个构造函数:
container.RegisterType<IService, Service>(new InjectionConstructor(typeof(IServiceDependency)));
您可以在想要的构造函数上使用 [InjectionConstructor] 属性
我遇到了同样的问题,将其添加到我的 unityconfig 中解决了它
public static void RegisterTypes(IUnityContainer container)
{
container.UseApplicationLayer(false);
container.UseApplicationRepository(false);
container.ConfigureMappings();
}
使用 Nhibernate
我正在 ASP.NET Webforms 项目中工作,使用 Unity 进行 DI。 本项目同样使用DevExpress ASP.NET Ajax控件。
现在我们遇到了 运行 问题,这似乎是 DevExpress 和 Unity 之间的冲突。
这是 Unity 配置
[assembly: WebActivator.PostApplicationStartMethod(typeof(Sales.Web.App_Start.UnityWebFormsStart), "PostStart")]
namespace Sales.Web.App_Start
{
/// <summary>
/// Startup class for the Unity.WebForms NuGet package.
/// </summary>
internal static class UnityWebFormsStart
{
/// <summary>
/// Initializes the unity container when the application starts up.
/// </summary>
/// <remarks>
/// Do not edit this method. Perform any modifications in the
/// <see cref="RegisterDependencies" /> method.
/// </remarks>
internal static void PostStart()
{
IUnityContainer container = new UnityContainer();
HttpContext.Current.Application.SetContainer(container);
RegisterDependencies(container);
}
/// <summary>
/// Registers dependencies in the supplied container.
/// </summary>
/// <param name="container">Instance of the container to populate.</param>
private static void RegisterDependencies(IUnityContainer container)
{
// TODO: Add any dependencies needed here
container
.RegisterType<IDbFactory, DbFactory>(new HierarchicalLifetimeManager())
.RegisterType(typeof(IDbProxy<>), typeof(DbProxy<>))
.RegisterType<IErpData, ErpData>(new HierarchicalLifetimeManager())
.RegisterType<ICaseData, CaseData>(new HierarchicalLifetimeManager())
.RegisterType<ICaseCauseData, CaseCauseData>(new HierarchicalLifetimeManager())
.RegisterType<ICaseHandler, CaseHandler>(new HierarchicalLifetimeManager());
}
}
}
任何此 Unity 配置都与 DevExpress 控件无关,但我认为它连接了 HttpContext 对象。
只有当我使用 DevExpress 的 TabControl 时才会出现此错误,所有其他控件都可以正常工作。
请参阅更详细地描述错误消息的附图。
按照惯例,如果没有提供其他配置,Unity 会优先使用具有最长参数列表的构造函数。具有两个参数列表长度相等的构造函数会产生歧义,因此 Unity 会抛出异常。这就是它无法解析您正在使用的控件的原因。
您可以明确告诉 Unity 首选哪个构造函数:
container.RegisterType<IService, Service>(new InjectionConstructor(typeof(IServiceDependency)));
您可以在想要的构造函数上使用 [InjectionConstructor] 属性
我遇到了同样的问题,将其添加到我的 unityconfig 中解决了它
public static void RegisterTypes(IUnityContainer container)
{
container.UseApplicationLayer(false);
container.UseApplicationRepository(false);
container.ConfigureMappings();
}
使用 Nhibernate