我在为我的测试注入一个实例到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?
大卫
问题在于 Castle DynamicProxy(Rhino Mocks 和 Moq 使用它)的 StructureMap 支持在 BuildUp 中使用时生成的存根。
具体来说,Castle 会为请求的代理类型生成一个带有 2 个参数的构造函数,并且这些参数没有名称。在这种情况下,StructureMap 中的 ConstructorFunctionBuilder 无法创建正确的 lambda 表达式(null 被视为 System.Object,而需要 System.String)。当您只想设置属性设置器时,甚至不需要这样做,但没有办法控制它。
“注入”将与非动态生成的存根一起使用,但您可能想寻找不同的解决方案。
| 归档时间: |
|
| 查看次数: |
1765 次 |
| 最近记录: |