2010-04-01 4 views
1

Lorsque je tente d'instancier mon instance de la classe de base, je reçois l'erreur:Unity L'hôte de paramètre ne peut pas être résolu lors d'une tentative de constructeur appeler

un ResolutionFailedException avec à peu près l'erreur suivante « L'hôte de paramètres ne peuvent pas être résolu lors de la tentative d'appel du constructeur "

Je n'utilise actuellement pas d'interface pour le type de base et mon instance de la classe hérite de la classe de type de base. Je suis nouveau à Unity et DI donc je pense que c'est quelque chose que j'ai oublié peut-être.

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>(); 

et le fichier 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> 

La classe de base

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(); 
     } 
    } 
} 

La mise en œuvre

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; } 
    } 
} 

Oui à la fois classe de base et la mise en œuvre sont dans le même Namespace et c'est quelque chose de design sage qui va changer une fois que j'obtiendrai ce travail. Oh et une erreur plus détaillée

La résolution de la dépendance a échoué, tapez = "Calculator.Logic.BaseCalculatorServer", name = "". Le message d'exception est: L'opération de génération en cours (clé de construction Build Key [Calculator.Logic.BaseCalculatorServer, null]) a échoué: La valeur de la propriété "Calculate" n'a pas pu être résolue. (Type de stratégie BuildPlanStrategy, indice 3)

+0

J'ai supprimé ma réponse jusqu'à ce que je puisse penser à quelque chose d'utile. ;) –

+0

Np, j'ai enlevé le constructeur pour le CalculateApi par souci de simplicité – Terrance

Répondre

2

Je ne suis pas sûr que cela déclenche l'unité, mais qu'advient-il si vous supprimez les Calculate et CalculationHistory propriétés de CalculateApi? Ceux-ci cachent les membres de la classe de base, qui est presque certainement ce que vous voulez faire. Je configure toujours dans le code, plutôt que XML, donc je ne suis pas sûr à ce sujet, mais peut-être essayer de supprimer l'attribut name de votre cartographie, ou en passant le nom correct lorsque vous appelez Resolve - Je devine quelque chose comme container.Resolve<BaseCalculatorServer>("CalculatorServer"). Sauf si vous enregistrez plusieurs implémentations, cependant, je supprimerais complètement le nom.

+0

Enlever les propriétés et nettoyer ma construction et courir encore semble avoir fonctionné pour n'importe quelle raison. Alors woot à cela. Merci – Terrance

Questions connexes