【问题标题】:StructureMap not possible to use injected instance for setter injectionStructureMap 无法使用注入的实例进行 setter 注入
【发布时间】:2011-01-30 12:06:16
【问题描述】:

我在将实例注入结构映射以进行测试时遇到问题。

我的对象图如下所示

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类型的Properties。

_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,版本=0.0.0.0,文化=中性, PublicKeyToken=null ----> System.ArgumentException : 的表达式 类型“System.Object”不能用于类型参数 方法'Castle.Core.Interceptor.IInterceptor[]的'System.String' GetIInterceptor[]'

为什么我注入实例时结构图会尝试使用 InstanceBuilder?

兄弟, 大卫

【问题讨论】:

  • 这个问题你解决了吗?我也有同样的例外。

标签: c# structuremap


【解决方案1】:

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

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

“注入”将适用于非动态生成的存根,但您可能需要寻找不同的解决方案。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多