我正在尝试在命令行应用程序(或更准确地说,来自LINQPad)中使用SolrNet来测试一些查询,并且在尝试初始化库时,我收到以下错误:
Key 'SolrNet.Impl.SolrConnection.UserQuery+Resource.SolrNet.Impl.SolrConnection' already registered in container
但是,如果我发现此错误并继续,ServiceLocator会给我以下错误:
Activation error occured while trying to get instance of type ISolrOperations`1, key ""
内部异常:
The given key was not present in the dictionary.
我的完整代码如下:
try
{
Startup.Init<Resource>("http://localhost:8080/solr/");
Console.WriteLine("Initialized\n");
}
catch (Exception ex)
{
Console.WriteLine("Already Initialized: " + ex.Message);
}
// This line causes the error if Solr is already initialized
var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Resource>>();
// Do the search
var results = solr.Query(new SolrQuery("title:test"));
我在安装了Solr 3.4.0的Windows 7x64上运行Tomcat 7。
StackOverflow上有another message about the same problem,但在Global.asax中放置Startup.Init代码的接受答案只与ASP.NET有关。
重新启动Tomcat7服务可以解决问题,但每次查询后都必须这样做。
使用SolrNet库从C#控制台应用程序与Solr交互的正确方法是什么?
答案 0 :(得分:5)
在控制台应用程序中使用SolrNet的正确方法是仅执行行
Startup.Init<Resource>("http://localhost:8080/solr/");
适用于控制台应用程序的生命周期。我通常把它作为我的Main方法的第一行,如下所示......
static void Main(string[] args)
{
Startup.Init<Resource>("http://localhost:8080/solr/");
//Call method or do work to query from solr here...
//Using your code in a method...
QuerySolr();
}
private static void QuerySolr()
{
var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Resource>>();
// Do the search
var results = solr.Query(new SolrQuery("title:test"));
}
您的错误来自于您尝试多次初始化SolrNet连接的事实。您只需在控制台应用程序启动时初始化一次,然后在需要时通过ServiceLocator引用(查找)。
答案 1 :(得分:2)
我的解决方案是在Init
之前启动Startup.Container.Clear();
Startup.InitContainer();
Startup.Init<Resource>("http://localhost:8080/solr/");