我遇到了将实例注入到我的测试的结构图中的问题。
我的对象图表看起来像这样
internal class ConfigurationManager : IConfigurationManager : IManager
{
public ISomeManager SomeManager { get; set; }
}
internal class SomeManager : ISomeManager : IManager
{
public IConfigurationManager ConfigurationManager { get; set; }
}
1)首先我创建容器并添加所有找到的注册表
_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 尝试为其创建InstanceBuilder时出错 IConfigurationManagerProxyd079980359cf491b821a3afb15be8a86, DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral, PublicKeyToken = null ----&gt; System.ArgumentException:表达式 类型'System.Object'不能用于类型的参数 方法'Castle.Core.Interceptor.IInterceptor []的'System.String' GetIInterceptor []'
为什么在我注入实例时,structuremap会尝试使用InstanceBuilder?
BR, 大卫
答案 0 :(得分:1)
问题在于在BuildUp中使用时,CastleMap支持Castle DynamicProxy(Rhino Mocks和Moq使用它)生成的存根。
特别是Castle为请求的代理类型生成一个带有2个参数的构造函数,这些参数没有名称。在这种情况下,StructureMap中的ConstructorFunctionBuilder无法创建正确的lambda表达式(null被视为System.Object所在的System.String)。当你只是想设置属性设置器时甚至不需要,但是没有办法控制它。
“Inject”将与非动态生成的存根一起使用,但您可能希望寻找其他解决方案。