Странное поведение StructureMap в .Net 4.0 - PullRequest
1 голос
/ 13 сентября 2010

У меня есть кусок кода, который я могу запустить четырьмя способами

  1. Отладочная сборка - в отладчике - работает просто отлично

  2. Отладочная сборка - внешний отладчик - не удается

  3. Выпуск сборки - в отладчике - не удается

  4. Выпуск сборки - внешний отладчик - завершается неудачей.

Код ошибки дает во всех случаях 202 - что-то связанное с конструкторами без параметров, стек вызовов внизу.

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

Я не могу собрать исходный код с помощью отладки, потому что я использую .Net 4.0 и, похоже, для его сборки не установлен .Net 2.0 SDK.

У меня заканчиваются идеи ....

Исключение:

Test method DataLoaders.Integration.ContactMappingTests.EntityContactMappingTest threw exception: 
StructureMap.StructureMapException: StructureMap Exception Code:  202
No Default Instance defined for PluginFamily System.Uri, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

CallStack:

StructureMap.BuildSession.<.ctor>b__0(Type t)
StructureMap.Util.Cache`2.get_Item(KEY key)
StructureMap.BuildSession.CreateInstance(Type pluginType)
StructureMap.Pipeline.DefaultInstance.build(Type pluginType, BuildSession session)
StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)
StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)
StructureMap.Pipeline.ConstructorInstance.Get[T](String propertyName, BuildSession session)
StructureMap.Pipeline.Arguments.Get[T](String propertyName)
lambda_method(Closure , IArguments )
StructureMap.Construction.BuilderCompiler.FuncCompiler`1.<>c__DisplayClass2.<CreateBuilder>b__0(IArguments args)
StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments args)
StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder)
StructureMap.Pipeline.ConstructorInstance.build(Type pluginType, BuildSession session)
StructureMap.Pipeline.SmartInstance`1.build(Type pluginType, BuildSession session)
StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session)
StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session)
StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session)
StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance)
StructureMap.BuildSession.<>c__DisplayClass3.<.ctor>b__1()
StructureMap.BuildSession.CreateInstance(Type pluginType)
StructureMap.Container.GetInstance[T]()
StructureMap.ObjectFactory.GetInstance[PLUGINTYPE]()
DataLoaders.Processor.ProcessData(DataConfig config) in D:\TFS\Main\Source\DataLoaders\DataLoaders\Processor.cs: line 20

Ответы [ 2 ]

3 голосов
/ 13 сентября 2010

Я не могу объяснить, почему это работает в одном случае, а не в других.

Однако я бы начал с изучения класса System.Uri. 4.0 добавил конструкторы в класс, что полностью изменило бы способ его разрешения контейнером. Я считаю, что StructureMap всегда будет пытаться использовать самый жадный конструктор по умолчанию.

API, возможно, изменился с этого поста, но это поможет вам по крайней мере: http://codebetter.com/blogs/jeremy.miller/archive/2009/01/07/choosing-the-constructor-function-in-structuremap-without-attributes.aspx

0 голосов
/ 17 октября 2016

После мучительного следа и ошибки, которую я мог воспроизвести, ошибка возникла из-за многократной регистрации IRestClient внутри одного экземпляра контейнера структурной карты .

ПРИМЕЧАНИЕ : должна быть только одна регистрация IRestClient.

Я добился этого, удалив все дубликаты регистрации и добавив их в родительское приложение, которое отвечает за его загрузку!

Это не идеальная ситуация, но я думаю, что мы застряли с этим даже с Restsharp v105.2.3.0 и StructureMap v2.6.4.0

...