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" будет работать с нединамически генерируемыми заглушками, но вы можете захотеть найти другое решение.