【问题标题】:SolrNet Autofac - Use SolrPostConnectionSolrNet Autofac - 使用 SolrPostConnection
【发布时间】:2018-10-02 15:17:33
【问题描述】:

我在我的 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 代替。

【问题讨论】:

    标签: c# autofac solrnet


    【解决方案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);
    }
    

    希望对你有帮助。

    【讨论】:

    • 乐于助人=)
    • 在使用 WebRequestFactory 时这似乎不起作用。 PostSolrConnection 不使用 Factory 来创建 WebRequest,而是使用 WebRequest.Create(如果您问我,这是不正确的)。在我的情况下,授权不起作用。
    • 我明白了。在这种情况下,您可能需要添加自己的PostSolrConnection 实现,它也将在其构造函数中接收工厂。 PostSolrConnection 看起来并不复杂。
    • 是的,这就是我最终所做的。稍后可能会创建一个拉取请求。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多