SolrNet Autofac - Используйте SolrPostConnection - PullRequest
0 голосов
/ 02 октября 2018

Я использую SolrNet с Autofac DI в моем веб-приложении, например:

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

Мои запросы довольно длинные и иногда заканчиваются 404 в Jetty, я довольноуверен, что это происходит, потому что длина URL.

Я читал о SolrPostConnection, и это звучит как правильное решение моей проблемы, но у меня возникают проблемы с реализациейэто в моей настройке Autofac.

Я знаю, что интеграция Autofac SolrNetModule внутренне использует

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

Но я не могу понять, как ее переопределить или .RegisterAutofac вместо SolrPostConnection.

1 Ответ

0 голосов
/ 03 октября 2018

Похоже, вам нужно отменить регистрацию для интерфейса 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);
}

Надеюсь, это поможет.

...