我在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
。
答案 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);
}
希望有帮助。