StructureMap невозможно использовать инъецированный экземпляр для инъекции сеттера

У меня возникла проблема с инъекцией экземпляра в структуру map для моих тестов.

Граф моих объектов выглядит следующим образом

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) Затем экземпляры менеджера создаются без инсталляции инсталляции (чтобы избежать круговых зависимостей)

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 Ошибка при попытке создания экземпляра InstanceBuilder для IConfigurationManagerProxyd079980359cf491b821a3afb15be8a86, DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = нейтральный, PublicKeyToken = null ---- > System.ArgumentException: выражение тип "System.Object" не может использоваться для параметра типа 'System.String' метода 'Castle.Core.Interceptor.IInterceptor [] GetIInterceptor []

Почему структура структуры пытается использовать экземпляр InstanceBuilder, когда я вставлял экземпляр?

Br, Дэвид

Ответы

Ответ 1

Проблема заключается в поддержке StructureMap Castle DynamicProxy (Rhino Mocks и Moq использует его) сгенерированные заглушки при использовании в BuildUp.

В частности, Castle создает конструктор с 2 параметрами для запрошенного типа прокси, и эти параметры не имеют имен. ConstructorFunctionBuilder в StructureMap не может создать правильное лямбда-выражение в таком случае (нуль рассматривается как System.Object, где ожидается System.String). Это даже не нужно, когда вы просто хотите настроить средства определения свойств, но нет способа контролировать это.

"Inject" будет работать с нединамически генерируемыми заглушками, но вы можете захотеть найти другое решение.