我在为我的测试注入实例时遇到了问题。
我的对象图像如下所示:
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