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

Dav*_*ger 15 c# structuremap

我在为我的测试注入一个实例到structmap时遇到了问题.

我的对象图看起来像这样

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

internal class SomeManager : ISomeManager : IManager
{
   public IConfigurationManager  ConfigurationManager { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

1)首先我创建容器并添加所有找到的注册表

_container = new Container(c => c.Scan(s =>
{
   s.TheCallingAssembly();
   s.LookForRegistries();
}));
Run Code Online (Sandbox Code Playgroud)

其中一个扫描的程序集包含以下注册

x.For<IConfigurationManager>().Singleton.Use<ConfigurationManager>();
Run Code Online (Sandbox Code Playgroud)

2)然后我想为这些经理注入一个特殊的模拟对象

_configurationManagerStub = MockRepository.GenerateStub<IConfigurationManager>();
_container.Inject(_configurationManagerStub);
Run Code Online (Sandbox Code Playgroud)

3)然后创建管理器实例,而不配置setter注入(以避免循环依赖)

foreach (Type pluginType in AllManagers())
{
   managerInstances.Add(_container.GetInstance(pluginType));
}
Run Code Online (Sandbox Code Playgroud)

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));
Run Code Online (Sandbox Code Playgroud)

不幸的是,在最后一行代码中,我得到以下异常.

StructureMap.StructureMapException:StructureMap异常代码:245尝试为IConfigurationManagerProxyd079980359cf491b821a3afb15be8a86创建InstanceBuilder时出错,DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null ----> System.ArgumentException:类型'System.Object的表达式'不能用于'Castle.Sore.Interceptor.IInterceptor [] GetIInterceptor []'方法'System.String'类型的参数

为什么在我注入实例时,structuremap会尝试使用InstanceBuilder?

大卫

Ant*_*ton 1

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

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

“注入”将与非动态生成的存根一起使用,但您可能想寻找不同的解决方案。