gpt4 book ai didi

c# - StructureMap 无法使用注入(inject)实例进行 setter 注入(inject)

转载 作者:可可西里 更新时间:2023-11-01 07:48:28 25 4
gpt4 key购买 nike

我在将实例注入(inject)结构图中进行测试时遇到问题。

我的对象图看起来像这样

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) 然后我想为这个管理器注入(inject)一个特殊的模拟对象

_configurationManagerStub = MockRepository.GenerateStub<IConfigurationManager>();
_container.Inject(_configurationManagerStub);

3) 然后在没有配置 setter 注入(inject)的情况下创建管理器实例(以避免循环依赖)

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 Exception Code: 245 Error while trying to create an InstanceBuilder for IConfigurationManagerProxyd079980359cf491b821a3afb15be8a86, DynamicProxyGenAssembly2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null ----> System.ArgumentException : Expression of type 'System.Object' cannot be used for parameter of type 'System.String' of method 'Castle.Core.Interceptor.IInterceptor[] GetIInterceptor[]'

为什么 structuremap 在我注入(inject)实例时尝试使用 InstanceBuilder?

Br,大卫

最佳答案

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

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

“注入(inject)”可用于非动态生成的 stub ,但您可能想寻找不同的解决方案。

关于c# - StructureMap 无法使用注入(inject)实例进行 setter 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4842793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com