Что значит использовать правильные переопределения службы Windsor? - PullRequest
3 голосов
/ 12 августа 2011

Я пытаюсь создать службу агента индекса для установки Solr с несколькими экземплярами с использованием SolrNet.Я создал сервис, который будет использовать интерфейс для создания нескольких агентов для индексации.Эти агенты указываются во внешнем файле конфигурации и создаются динамически.Например, может быть 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 для этого.Согласно вики SolrNet на http://code.google.com/p/solrnet/wiki/MultiCoreAccess это довольно просто.

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, но я не уверен, что автор вики имел в виду под комментарием к "использовать правильные переопределения службы Windsor вместо того, чтобы разрешать вот так" как указано в примере кода.Очевидно, что пример явно идентифицирует ядро ​​через id, но есть ли лучший / более гибкий способ?

1 Ответ

3 голосов
/ 12 августа 2011

Я имел в виду, что вы обычно не разрешаете ISolrOperations<T> непосредственно из контейнера.

Вместо этого вы используете переопределения службы или другие механизмы Виндзора, чтобы определить, какой ISolrOperations<T> компонент (какое ядро) следует передать другим компонентам, особенно если у вас несколько ядер с одним и тем же типом документа, например в этом примере есть два компонента, зарегистрированных под типом службы ISolrOperations<Product>.

...