2011-01-30 46 views
15

我在爲我的測試注入實例到結構映射時遇到問題。StructureMap不可能使用注入實例進行setter注入

我的對象圖形看起來像這樣

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

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

1)第一i-創建容器,並添加所有發現登記

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

這些掃描組件中的一個包含下列登記

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

2)然後我要注入一個特殊的模擬對象此管理者

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

3)然後,管理器實例在沒有setter注入配置創建(以避免循環依賴)

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

4)最後我使用BuildUp方法來設置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)); 

不幸在代碼的最後一行我得到以下異常。

StructureMap.StructureMapException:StructureMap異常代碼:245 錯誤,並嘗試爲 IConfigurationManagerProxyd079980359cf491b821a3afb15be8a86, DynamicProxyGenAssembly2創建InstanceBuilder,版本= 0.0.0.0,文化=中立, 公鑰=空---->系統.ArgumentException:不能被用於方法的類型 'System.String' 的參數 類型 'System.Object的' 表達 'Castle.Core.Interceptor.IInterceptor [] GetIInterceptor []'

爲什麼當我注入實例時,結構映射嘗試使用InstanceBuilder?

BR, 大衛

+0

你解決了這個問題嗎?我有同樣的例外。 – AdamSane 2012-04-11 13:27:12

回答

1

的問題是與StructureMap支持城堡DynamicProxy的(犀牛製品和起訂量使用它)中累積使用時產生的存根。

具體地說城堡生成與2個參數爲請求的代理類型和這些參數沒有名稱的構造器。在這種情況下,StructureMap中的ConstructorFunctionBuilder無法創建正確的lambda表達式(null被視爲System.Object,其中System.String是預期的)。當你只是想設置屬性設置器時,這甚至不需要,但是沒有辦法控制它。

的「注入」將與非動態生成存根的工作,但你可能想尋找一個不同的解決方案。