Search code examples
c#autofacsolrnet

SolrNet Autofac - Use SolrPostConnection


I'm using SolrNet with Autofac DI in my web application like this:

var solrNetModule = new SolrNetModule(ConfigurationManager.ConnectionStrings["solr"].ConnectionString);
solrNetModule.HttpWebRequestFactory = new BasicAuthHttpWebRequestFactory("****", "****");
builder.RegisterModule(solrNetModule);

My queries are quite long and sometimes end up with a 404 in Jetty, I'm pretty sure this happens because the length of the URL.

I've been reading about the SolrPostConnection and that sounds like a proper solution to my problem, but I'm having trouble implementing it in my Autofac setup.

I know the Autofac SolrNetModule integration internally uses

builder.RegisterInstance(solrConnectionInstance).As<ISolrConnection>();

But I can't figure out how to override it or .Register Autofac to use the SolrPostConnection instead.


Solution

  • Looks like you need to override registration for interface ISolrConnection. The main problem is that SolrNetModule doesn't provide mapping of SolrConnection to itself. Try out the example below. I added another registration of SolrConnection to make it available for injecting to contructor of PostSolrConnection without dependency loops

    [Test]
    public void SolrRegistrationOverride()
    {
        // Arrange
        var builder = new ContainerBuilder();
        var serverUrl = ConfigurationManager.ConnectionStrings["solr"].ConnectionString;
        var httpWebRequestFactory = new BasicAuthHttpWebRequestFactory("****", "****");
        var solrNetModule = new SolrNetModule(serverUrl);
        solrNetModule.HttpWebRequestFactory = httpWebRequestFactory;
        builder.RegisterModule(solrNetModule);
    
        builder.RegisterType<SolrConnection>().AsSelf()
               .WithParameter(new NamedParameter("serverURL", serverUrl))
               .WithProperty("HttpWebRequestFactory", httpWebRequestFactory).AsSelf()
               .SingleInstance();
    
        builder.RegisterType<PostSolrConnection>().As<ISolrConnection>()
               .WithParameters(new Parameter[]
               {
                   new ResolvedParameter((prm, сtx) => prm.Name == "conn", (prm, ctx) => ctx.Resolve<SolrConnection>()),
                   new NamedParameter("serverUrl", serverUrl)
               });
    
        var container = builder.Build();
    
        // Act
        var conn = container.Resolve<ISolrConnection>();
    
        // Assert
        Assert.IsInstanceOf<PostSolrConnection>(conn);
    }
    

    Hope it helps.