【问题标题】:Unity The parameter host could not be resolved when attempting to call constructorunity 尝试调用构造函数时无法解析参数host
【发布时间】:2010-04-01 19:02:35
【问题描述】:

当我尝试实例化我的基类实例时,出现错误:

ResolutionFailedException 大致如下错误“尝试调用构造函数时无法解析参数主机”

我目前没有为基类型使用接口,并且我的类实例正在继承基类型类。我是 Unity 和 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”的值。 (策略类型 BuildPlanStrategy,索引 3)

【问题讨论】:

  • 删除我的答案,直到我能想到一些真正有用的东西。 ;)
  • Np,为了简单起见,我删除了 CalculateApi 的构造函数

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


【解决方案1】:

我不确定这是否会使 Unity 出错,但是如果您从 CalculateApi 中删除 CalculateCalculationHistory 属性会发生什么?这些隐藏了基类的成员,这几乎肯定不是你想要做的。

我总是在代码中进行配置,而不是在 XML 中进行配置,所以我对此不确定,但也许可以尝试从映射中删除 name 属性,或者在调用 Resolve 时传递正确的名称 - 我'我猜像container.Resolve&lt;BaseCalculatorServer&gt;("CalculatorServer")。不过,除非您要注册多个实现,否则我会完全删除该名称。

【讨论】:

  • 删除属性并清理我的构建并再次运行似乎无论出于何种原因都有效。所以对此很感兴趣。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多