Как использовать Castle Windsor для создания сеанса RavenDB с клиентской версией> 3.0.3660?

Я использую Castle Windsor v3.4.0 для создания экземпляра сеанса документов RavenDB, но когда я использую версию клиента RavenDB более позднюю, чем 3.0.3660, я получаю эту ошибку при вызове метода Store:

Castle.MicroKernel.ComponentNotFoundException: 'No component for supporting the service System.Net.Http.HttpMessageHandler was found'

Вот самый маленький фрагмент кода, который я могу придумать, который воспроизводит ошибку:

using Castle.Facilities.TypedFactory;
using Castle.MicroKernel.Registration;
using Castle.Windsor;
using Raven.Client;
using Raven.Client.Document;

public class Program
{
    public static void Main()
    {
        var container = new WindsorContainer();
        container.AddFacility<TypedFactoryFacility>();

        container.Register(
            Component
                .For<IDocumentStore>()
                .ImplementedBy<DocumentStore>()
                .DependsOn(new { Url = "http://localhost:8081", DefaultDatabase = "Test" })
                .OnCreate(x => x.Initialize())
                .LifeStyle.Singleton,
            Component
                .For<IDocumentSession>()
                .UsingFactoryMethod(x => x.Resolve<IDocumentStore>().OpenSession())
                .LifeStyle.Transient);

        using (var documentSession = container.Resolve<IDocumentSession>())
        {
            documentSession.Store(new object());
            documentSession.SaveChanges();
        }
    }    
}

Вот то, что я считаю, происходит. После версии 3.0.3660 в клиенте RavenDB было внесено изменение, которое изменило способ создания HttpMessageHandler в классе HttpJsonRequest:

https://github.com/ravendb/ravendb/commit/740ad10d42d50b1eff0fc89d1a6894fd57578984

Я считаю, что это изменение в сочетании с моим использованием TypedFactoryFacility в моем контейнере Windsor заставляет RavenDB запрашивать экземпляр HttpJsonRequestFactory и его зависимостей от Windsor, а не использовать его собственный внутренний.

Как я могу изменить свой код, чтобы избежать этой проблемы, чтобы я мог использовать более свежую версию клиента RavenDB?

1 ответ

Решение

Учитывая ваш MVCE, Windsor настроен на внедрение свойств объекта. Итак, при создании DocumentStoreКасл пытается найти значение для HttpMessageHandlerFactory свойство и терпит неудачу, так как ничего не настроено для этого конкретного типа.

Я смог заставить ваш пример работать (по крайней мере, он вставил данные в мой несуществующий сервер), просто отфильтровав это свойство:

container.Register(
    Component.For<IDocumentStore>()
            .ImplementedBy<DocumentStore>()
            .DependsOn(new { Url = "http://localhost:8081", DefaultDatabase = "Test" })
            .OnCreate(x => x.Initialize())
            .PropertiesIgnore(p => p.Name == nameof(DocumentStore.HttpMessageHandlerFactory))
            .LifeStyle.Singleton);

В качестве альтернативы, если у вас есть значение для него, вы можете добавить его к объекту, переданному в DependsOn(),

Другие вопросы по тегам