StructureMap不可能使用注入实例进行setter注入

时间:2011-01-30 12:06:16

标签: c# structuremap

我遇到了将实例注入到我的测试的结构图中的问题。

我的对象图表看起来像这样

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, 大卫

1 个答案:

答案 0 :(得分:1)

问题在于在BuildUp中使用时,CastleMap支持Castle DynamicProxy(Rhino Mocks和Moq使用它)生成的存根。

特别是Castle为请求的代理类型生成一个带有2个参数的构造函数,这些参数没有名称。在这种情况下,StructureMap中的ConstructorFunctionBuilder无法创建正确的lambda表达式(null被视为System.Object所在的System.String)。当你只是想设置属性设置器时甚至不需要,但是没有办法控制它。

“Inject”将与非动态生成的存根一起使用,但您可能希望寻找其他解决方案。