How do I use Castle Windsor to create a RavenDB session with client version > 3.0.3660?

﹥>﹥吖頭↗ 提交于 2019-12-11 07:58:27

问题


I am using Castle Windsor v3.4.0 to create a RavenDB document session instance but when I use a RavenDB client version later than 3.0.3660 I get this error when calling the Store method:

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

Here is the smallest piece code I can come up with that reproduces the error:

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();
        }
    }    
}

Here's what I believe is happening. A change was made to the RavenDB client after v3.0.3660 that changed how the HttpMessageHandler is created in the HttpJsonRequest class:

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

I believe that this change in combination with my use of the TypedFactoryFacility in my Windsor container is causing RavenDB to request an instance of HttpJsonRequestFactory and it's dependencies from Windsor rather than using it's own internal one.

How I can change my code to avoid this problem so that I can use a more recent version of the RavenDB client?


回答1:


Given your MVCE, Windsor is set up to inject object's properties. So, when creating the DocumentStore, Castle is trying to find a value for the HttpMessageHandlerFactory property and is failing since nothing is configured for that particular type.

I was able to get your example to work (at least, it got to inserting the data into my non-existing server) by just filtering out that property:

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);

Alternatively, if you have a value for it, you could add it to the object passed to DependsOn().



来源:https://stackoverflow.com/questions/45054431/how-do-i-use-castle-windsor-to-create-a-ravendb-session-with-client-version-3

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!