StructureMap不支持使用注入的实例进行setter注入。

15

我在为我的测试注入实例时遇到了问题。

我的对象图像如下所示:

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, 尝试为 IConfigurationManagerProxyd079980359cf491b821a3afb15be8a86 ,DynamicProxyGenAssembly2,Version=0.0.0.0,Culture=neutral, PublicKeyToken=null 创建 InstanceBuilder 时出错 ----> System.ArgumentException: 无法将类型为“System.Object”的表达式用作方法“Castle.Core.Interceptor.IInterceptor[] GetIInterceptor[]”的参数类型为“System.String”的参数

为什么 StructureMap 在我已经注入实例的情况下仍然尝试使用 InstanceBuilder?

敬礼,David


你解决了这个问题吗?我也遇到了同样的异常。 - AdamSane
1个回答

1
问题在于StructureMap不支持Castle DynamicProxy(Rhino Mocks和Moq使用它)生成的存根在BuildUp中的使用。
具体来说,Castle为请求的代理类型生成了一个带有2个参数的构造函数,并且这些参数没有名称。在这种情况下,StructureMap中的ConstructorFunctionBuilder无法创建适当的lambda表达式(将null视为System.String所期望的System.Object)。当您只想设置属性设置器时,甚至不需要这个参数,但是没有办法控制这一点。
“Inject”将适用于非动态生成的存根,但您可能需要寻找其他解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接