StructureMap невозможно использовать внедренный экземпляр для внедрения сеттера - PullRequest
15 голосов
/ 30 января 2011

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

График моих объектов выглядит так

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

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

Br, David

1 Ответ

1 голос
/ 28 января 2013

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

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

...