SolrNet Autofac - 使用 SolrPostConnection

SolrNet Autofac - Use SolrPostConnection

我在我的 Web 应用程序中使用 SolrNetAutofac DI,如下所示:

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

我的查询很长,有时在 Jetty 中以 404 结束,我很确定会发生这种情况,因为 URL.

的长度

我一直在阅读有关 SolrPostConnection 的文章,这听起来像是解决我的问题的正确方法,但我在 Autofac 设置中实施它时遇到了问题。

我知道 Autofac SolrNetModule 集成在内部使用

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

但我不知道如何覆盖它或 .Register Autofac 改用 SolrPostConnection

您似乎需要覆盖接口 ISolrConnection 的注册。主要问题是 SolrNetModule 不提供 SolrConnection 到自身的映射。试试下面的例子。我添加了 SolrConnection 的另一个注册,使其可用于注入 PostSolrConnection 的构造函数而没有依赖循环

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

希望对您有所帮助。