代码之家  ›  专栏  ›  技术社区  ›  Terrance

无法解析尝试调用主机Unity的构造函数

  •  1
  • Terrance  · 技术社区  · 15 年前

    当我试图实例化我的基类实例时,我得到一个错误:

    无法解析带有“failedException”参数的构造函数

    我当前没有为基类型使用接口,并且我的类实例正在继承基类型类。我是新来的统一和DI,所以我想它的东西我可能忘了。

    ExeConfigurationFileMap map = new ExeConfigurationFileMap();
    map.ExeConfigFilename = "Unity.Config";
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map,  ConfigurationUserLevel.None);
    UnityConfigurationSection section = (UnityConfigurationSection)config.GetSection("unity");
    IUnityContainer container = new UnityContainer();
    section.Containers.Default.Configure(container);
    //Throws exception here on this
    BaseCalculatorServer server = container.Resolve<BaseCalculatorServer>();
    

    以及Unity.Config文件

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    
        <!--Unity Configuration-->
        <configSections>
            <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, 
               Microsoft.Practices.Unity.Configuration"/>
        </configSections>
    
        <unity>
            <containers>
    
                <container>
    
                    <types>
                        <type name ="CalculatorServer" type="Calculator.Logic.BaseCalculatorServer, Calculator.Logic" mapTo="Calculator.Logic.CalculateApi, Calculator.Logic"/>
                    </types>
    
                </container>
    
            </containers>
        </unity>
    
    </configuration>
    

    基类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Transactions;
    using Microsoft.Practices.Unity;
    using Calculator.Logic;
    
    namespace Calculator.Logic
    {
    
        public class BaseCalculatorServer : IDisposable
        {
            public BaseCalculatorServer(){}
            public CalculateDelegate Calculate { get; set; }
            public CalculationHistoryDelegate CalculationHistory { get; set; }
    
    
            /// <summary>
            /// Performs application-defined tasks associated with freeing, releasing, or     resetting unmanaged resources.
            /// </summary>
            public void Dispose()
            {
                this.Dispose();
            }
        }
    }
    

    实施

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Calculator.Logic;
    using System.ServiceModel;
    using System.ServiceModel.Configuration;
    using Microsoft.Practices.Unity;
    
    namespace Calculator.Logic
    {
        public class CalculateApi:BaseCalculatorServer
        {
            public CalculateDelegate Calculate { get; set; }
            public CalculationHistoryDelegate CalculationHistory { get; set; }
        }
    }
    

    是的,基类和实现都在同一个名称空间中,这是一些设计方面的东西,一旦我开始工作就会改变。 哦,还有一个更详细的错误

    解析依赖项失败,type=“Calculator.Logic.BaseCalculatorServer”,name=“”。异常消息是:当前生成操作(生成键build key[Calculator.Logic.BaseCalculatorServer,null])失败:无法解析属性“Calculate”的值(策略类型(策略,索引3)

    1 回复  |  直到 15 年前
        1
  •  2
  •   Jay    15 年前

    我不确定这是否会绊倒Unity,但如果您删除 Calculate CalculationHistory 属性来自 CalculateApi

    我总是在代码中配置,而不是XML,所以我不确定这一点,但也许可以尝试删除 name 属性,或者在调用 Resolve --我猜是这样的 container.Resolve<BaseCalculatorServer>("CalculatorServer") . 不过,除非您注册了多个实现,否则我会完全删除这个名称。