使用适当的温莎服务覆盖意味着什么?

时间:2011-08-12 14:39:48

标签: c# castle-windsor solrnet

我正在尝试使用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明确标识核心,但是有更好/更灵活的方式吗?

1 个答案:

答案 0 :(得分:3)

我的意思是您通常直接从容器中解析ISolrOperations<T>

相反,您使用service overrides或其他Windsor机制来定义要传递给其他组件的ISolrOperations<T>组件(哪个核心),尤其是当您有多个具有相同文档类型的核心时,例如在此示例中,在服务类型ISolrOperations<Product>下注册了两个组件。