Unity Параметр host не может быть разрешен при попытке вызвать конструктор - PullRequest
1 голос
/ 01 апреля 2010

Когда я пытаюсь создать экземпляр моего базового класса, я получаю сообщение об ошибке:

a ResolutionFailedException с примерно следующей ошибкой «Не удалось разрешить параметр host при попытке вызвать конструктор»

В настоящее время я не использую интерфейс для базового типа, и мой экземпляр класса наследует класс базового типа. Я новичок в 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]) завершилась неудачно: значение свойства «Рассчитать» не может быть разрешено. (Тип стратегии BuildPlanStrategy, индекс 3)

1 Ответ

2 голосов
/ 02 апреля 2010

Я не уверен, что это отключит Unity, но что произойдет, если вы удалите свойства Calculate и CalculationHistory из CalculateApi? Они скрывают членов базового класса, который почти наверняка не , что вы хотите делать.

Я всегда настраиваю в коде, а не в XML, поэтому я не уверен в этом, но, возможно, попробуйте удалить атрибут name из сопоставления или передать правильное имя при вызове Resolve - Я думаю, что-то вроде container.Resolve<BaseCalculatorServer>("CalculatorServer"). Если только вы не регистрируете несколько реализаций, я бы вообще удалил имя.

...