Как использовать 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()
,