2010-02-11 11 views
7

Próbuję wykonać najnowszą kompilację StructureMap, aby dowiedzieć się więcej o kontenerach IoC i tym podobnych. Jako mój pierwszy test, mam następujące klasy:Kod wyjątku StructureMap 205 Brak żądanej właściwości instancji

public class Hospital 
    { 
     private Person Person { get; set; } 
     private int Level { get; set; } 

     public Hospital(Person employee, int level) 
     { 
      Person = employee; 
      Level = level; 
     } 

     public void ShowId() 
     { 
      Console.WriteLine(this.Level); 
      this.Person.Identify(); 
     } 
    } 

Następnie używać StructureMap tak:

static void Main() 
     { 
      ObjectFactory.Configure(x => 
             { 
              x.For<Person>().Use<Doctor>(); 
              x.ForConcreteType<Hospital>().Configure.Ctor<int>().Equals(23); 
             }); 

      var h = ObjectFactory.GetInstance<Hospital>(); 

      h.ShowId(); 
     } 

Jestem więc przekazując obiekt z lekarzem, ponieważ pierwszego konstruktora param do szpitala, a ja Próbuję ustawić level param do 23. Kiedy uruchomić powyższy kod uzyskać:

Unhandled Wyjątek: StructureMap.StructureMapException: StructureMap Kod wyjątku: 205 Zaginione o właściwość "poziom" Instance dla InstanceKey "5f8c4b74-a398-43f7- 91d5-cfefcdf120cf"

Wygląda więc na to, że nie jestem ustawiania level param w ogóle. Czy ktoś może wskazać mi właściwy kierunek - w jaki sposób ustawić parametr level w konstruktorze?

Pozdrawiam. Jas.

Odpowiedz

12

Byłeś bardzo blisko. Przypadkowo użyłeś metody System.Object.Equals w wyrażeniu zależności niż w metodzie Is. Polecam również przy konfigurowaniu typów wspólnych, takich jak ciąg lub typy wartości (int, DateTime), aby określić nazwę argumentu konstruktora, aby uniknąć niejasności.

Oto moja próba z czego szukasz:

[TestFixture] 
public class configuring_concrete_types 
{ 
    [Test] 
    public void should_set_the_configured_ctor_value_type() 
    { 
     const int level = 23; 
     var container = new Container(x => 
     { 
      x.For<Person>().Use<Doctor>(); 
      x.ForConcreteType<Hospital>().Configure.Ctor<int>("level").Is(level); 
     }); 

     var hospital = container.GetInstance<Hospital>(); 

     hospital.Level.ShouldEqual(level); 
    } 
} 
+0

Wielki, który pracował :) –

+0

miałem podobny problem, tutaj Innym możliwym rozwiązaniem dla tego samego komunikatu o błędzie: http: // stackoverflow. com/questions/6998346/telling-structuremap-to-use-another-constructor – Jaider