SolrNet Autofac-使用SolrPostConnection

时间:2018-10-02 15:17:34

标签: c# autofac solrnet

我在Web应用程序中将SolrNet DI与Autofac一起使用:

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

1 个答案:

答案 0 :(得分:1)

好像您需要覆盖接口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);
}

希望有帮助。