Определение синглтона HttpClient через StructureMap приводит к ошибке о том, что HttpMessageHandler не настроен во время выполнения - PullRequest
0 голосов
/ 03 января 2019

Попытка определить синглтон HttpClient в StructureMap ala:

For<HttpClient>().Singleton().UseIfNone<HttpClient>();

Это приводит к следующей ошибке во время выполнения (после внедрения зависимости):

   StructureMap.StructureMapConfigurationException: No default Instance is registered and cannot be automatically determined for type 'System.Net.Http.HttpMessageHandler'

   There is no configuration specified for System.Net.Http.HttpMessageHandler

   1.) new HttpClient(*Default of HttpMessageHandler*)
   2.) System.Net.Http.HttpClient
   3.) Instance of System.Net.Http.HttpClient
   4.) new AdmanAdapter(*Default of HttpClient*)
   5.) Organotiki.vNext.PostEval.Data.Adapters.ADMAN.AdmanAdapter
   6.) Instance of [....]

      at lambda_method(Closure , IBuildSession , IContext )
      at StructureMap.Building.BuildPlan.Build(IBuildSession session, IContext context)
      at StructureMap.BuildSession.BuildNewInSession(Type pluginType, Instance instance)
      at StructureMap.Pipeline.NulloTransientCache.Get(Type pluginType, Instance instance, IBuildSession session)
      at StructureMap.BuildSession.ResolveFromLifecycle(Type pluginType, Instance instance)
      at StructureMap.SessionCache.GetObject(Type pluginType, Instance instance, ILifecycle lifecycle)

Если мы также настроим HttpMessageHandler следующим образом:

For<HttpClient>().Singleton().UseIfNone<HttpClient>();
For<HttpMessageHandler>().UseIfNone(x => new HttpClientHandler());

Тогда проблема исчезнет. Вопрос почему? Конструктор по умолчанию для HttpClient позаботится о внедрении собственной зависимости:

/// <summary>Initializes a new instance of the <see cref="T:System.Net.Http.HttpClient" /> class.</summary>
[__DynamicallyInvokable]
public HttpClient()
  : this((HttpMessageHandler) new HttpClientHandler())
{
}

Я что-то здесь упускаю?

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Расширяя ответ @Brad M, у меня сработало .SelectConstructor(() => new HttpClient()).Указание, какой конструктор должен использоваться явно.

0 голосов
/ 03 января 2019

Из документов Structuremap в http://structuremap.github.io/registration/constructor-selection

Если в конкретном классе есть несколько открытых функций конструктора, то поведение StructureMap по умолчанию состоит в выборе «жадного» конструктора, то есть функции конструктора сбольшинство параметров.

Если вы посмотрите на возможные конструкторы для HttpClient, это должно быть

public HttpClient();
public HttpClient(HttpMessageHandler handler);
public HttpClient(HttpMessageHandler handler, bool disposeHandler);
...