类型X有多个长度为1的构造函数。无法消除歧义

时间:2015-01-26 15:09:02

标签: c# asp.net dependency-injection unity-container

我正在使用ASP.NET Webforms项目并使用Unity for 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时才会出现此错误,所有其他控件都能正常运行。

请参阅附加图片,详细描述错误消息。

enter image description here

3 个答案:

答案 0 :(得分:13)

按照惯例,如果没有提供其他配置,Unity会优先选择具有最长参数列表的构造函数。具有两个具有相等长度的参数列表的构造函数会产生歧义,因此Unity会抛出异常。这就是为什么它无法解决您正在使用的控件的原因。

您可以明确告诉Unity更喜欢哪个构造函数:

container.RegisterType<IService, Service>(new InjectionConstructor(typeof(IServiceDependency)));

答案 1 :(得分:6)

您可以在想要的构造函数

上使用[InjectionConstructor]属性

答案 2 :(得分:0)

我在将它添加到我喜欢的unityconifg中时遇到了同样的问题

    public static void RegisterTypes(IUnityContainer container)
    {
        container.UseApplicationLayer(false);
        container.UseApplicationRepository(false);
        container.ConfigureMappings();
    }

使用Nhiberante