2011-01-30 9 views
15

Mam problem z wstrzyknięciem instancji do struktury mapy dla moich testów.Struktura Nie można użyć wstrzykniętej instancji do wstrzyknięcia settera.

Moje obiekty wykres wygląda tak

internal class ConfigurationManager : IConfigurationManager : IManager 
{ 
    public ISomeManager SomeManager { get; set; } 
} 

internal class SomeManager : ISomeManager : IManager 
{ 
    public IConfigurationManager ConfigurationManager { get; set; } 
} 

1) najpierw tworzę kontener i dodać wszystkie znalezione rejestrów

_container = new Container(c => c.Scan(s => 
{ 
    s.TheCallingAssembly(); 
    s.LookForRegistries(); 
})); 

jeden z tych zeskanowanych zespołów zawiera następujące rejestrację

x.For<IConfigurationManager>().Singleton.Use<ConfigurationManager>(); 

2) następnie chcę, aby wprowadzić specjalny atrapa obiektu dla tych menedżerów

_configurationManagerStub = MockRepository.GenerateStub<IConfigurationManager>(); 
_container.Inject(_configurationManagerStub); 

3) Następnie przypadki manager są tworzone bez setter zastrzyku skonfigurowanego (w celu uniknięcia wzajemnie od siebie zależnych)

foreach (Type pluginType in AllManagers()) 
{ 
    managerInstances.Add(_container.GetInstance(pluginType)); 
} 

4) Wreszcie używam metody BuildUp, aby ustawić Właściwości typu IManager.

_container.Configure(x => x.SetAllProperties(c => 
{ 
    // configure the property injection for all managers 
    c.Matching(prop => typeof(IManager).IsAssignableFrom(prop.PropertyType)); 
})); 

// push in dependencies -> EXCEPTION 
managerInstances.ForEach(x => _container.BuildUp(x)); 

Niestety w ostatnim wierszu kodu otrzymuję następujący wyjątek.

StructureMap.StructureMapException: StructureMap Kod Wyjątek: 245 Błąd podczas próby utworzenia InstanceBuilder dla IConfigurationManagerProxyd079980359cf491b821a3afb15be8a86, DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = neutral, TokenKluczaPublicznego = null ----> System .ArgumentException Ekspresja typu 'System.Object' nie może być stosowany dla parametru typu 'System.String' metody 'Castle.Core.Interceptor.IInterceptor [] GetIInterceptor []'

Dlaczego structmap próbuje użyć InstanceBuilder, gdy wstrzyknąłem wystąpienie?

Br David

+0

Rozwiązałeś ten problem? Mam ten sam wyjątek. – AdamSane

Odpowiedz

1

Problem jest z StructureMap wsparciu Castle DynamicProxy (Rhino Mocks i Moq używa go) generowane odcinki użyte w gromadzeniu.

W szczególności zamek generuje konstruktor z 2 parametrami dla żądanego typu proxy, a te parametry nie mają nazw. ConstructorFunctionBuilder w ramach StructureMap nie tworzy właściwego wyrażenia lambda w takim przypadku (null jest traktowany jako System.Object, gdzie oczekiwane jest System.String). To nie jest nawet potrzebne, gdy chcesz tylko ustawić ustawiaczy właściwości, ale nie ma sposobu, aby to kontrolować.

"Wstrzykiwanie" będzie działać z nie-dynamicznie generowanymi kodami pośredniczącymi, ale możesz chcieć szukać innego rozwiązania.

Powiązane problemy