我正在尝试使用SolrNet为多实例Solr安装创建索引代理服务。我已经创建了该服务,该服务将使用一个接口来创建多个代理以进行索引。这些代理在外部配置文件中指定并动态实例化。例如,每个代理类型可以有0-n(注意URL差异):
PersonAgent http://localhost:8080/solr
ProductAgent http://localhost:8080/solr
ProductAgent http://localhost:9999/solr
这当然需要映射到这样的东西:
ISolrOperations<Person>
ISolrOperations<Product>
ISolrOperations<Product>
根据我的需求以及SolrNet不支持其默认容器的多个实例的事实,我正在尝试使用Castle Windsor。根据{{3}}的SolrNet wiki,这非常简单。
var solrFacility = new SolrNetFacility("http://localhost:8983/solr/defaultCore");
solrFacility.AddCore("core0-id", typeof(Product), "http://localhost:8983/solr/product");
solrFacility.AddCore("core1-id", typeof(Product), "http://localhost:8983/solr/product2");
solrFacility.AddCore(typeof(Person), "http://localhost:8983/solr/person"); // no need to set an explicit ID since it's the only core for Person
container.AddFacility("solr", solrFacility);
ISolrOperations<Person> solrPerson = container.Resolve<ISolrOperations<Person>>();
ISolrOperations<Product> solrProduct1 = container.Resolve<ISolrOperations<Product>>("core0-id"); // use proper Windsor service overrides instead of resolving like this
ISolrOperations<Product> solrProduct2 = container.Resolve<ISolrOperations<Product>>("core1-id");
我并没有完全迷失于IoC的想法,但我不确定wiki作者对“使用适当的Windsor服务覆盖而不是像这样解决”的评论意味着什么代码示例。显然,该示例通过id明确标识核心,但是有更好/更灵活的方式吗?
答案 0 :(得分:3)
我的意思是您通常不直接从容器中解析ISolrOperations<T>
。
相反,您使用service overrides或其他Windsor机制来定义要传递给其他组件的ISolrOperations<T>
组件(哪个核心),尤其是当您有多个具有相同文档类型的核心时,例如在此示例中,在服务类型ISolrOperations<Product>
下注册了两个组件。