0

我正在建立一个小型基础设施,用于与不同的搜索系统(例如 Apache Solr、SQL DB 等)进行通信。对于每个系统,我都有一个单独的类 (="communicator"),它实现了一个公共接口,以便后续应用程序可以以相同的方式与所有搜索系统“对话”。此外,每个搜索系统都有自己的类,我用它来创建实际查询。该单个查询类的对象保存所有相关的查询参数并传递给相应的通信器类。所以对于 Solr,它看起来像这样:

Solr solr = new Solr();
SolrQuery sQuery = new SolrQuery();
//use some methods on sQuery to specify the query
var result = solr.query(sQuery);

到现在为止还挺好。但是如何在界面中指定查询方法呢?Solr 类需要一个 SolrQuery 类型的对象。MySQL 类需要一个 MySQLQuery 类型的对象。

我想要的一种解决方案是:我像这样更改整个界面:

interface ISearchTechnology<T>
{
  someReturnType query(T queryObject);
}

然后将 Solr (eg) 的类定义更改为

class Solr : ISearchTechnology<SolrQuery>

这样可行。但这在概念上没有意义。SolrQuery 类型仅与这一方法(查询)相关,与整个类无关。我可能需要包括其他类型(SolrQuery 除外,例如 SolrAnswer)。包括所有这样的人是令人困惑的,违反了我对这个概念的理解。

我试图将该<T>部分附加到接口(query<T>(T queryObject))中的方法,但我还没有找到任何实际实现它的方法。

最后我想有以下情况:每个通信器类都实现了接口要求的查询方法,但只接受一种特定类型的参数,与所有其他通信器类不同。

谢谢

4

2 回答 2

1

ISearchTechnology<T>即使从概念的角度来看,您的方法也是正确的。

于 2012-07-25T06:46:45.303 回答
0

这个怎么样:

public interface ITechnology<TQuery, TSearch>
{
    TQuery Query(TQuery queryObject);
    TSearch Search(TSearch saerchObject);
}

public interface ISolrTechnology : ITechnology<SolrQuery, SolrSearch>
{
}

public class Solr : ISolrTechnology
{
    public SolrQuery Query(SolrQuery queryObject) {
        // ...
    }
    public SolrSearch Search(SolrSearch searchObject) {
        // ...
    }
}

interface ISolrTechnology当然是可选的。class Solr可以继承ITechnology<SolrQuery, SolrSearch>自己。

于 2012-07-25T07:27:15.877 回答