2011-01-30 83 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是预期的)。当你只是想设置属性设置器时,这甚至不需要,但是没有办法控制它。

的“注入”将与非动态生成存根的工作,但你可能想寻找一个不同的解决方案。

相关问题