我正在建立一个小型基础架构,用于与不同的搜索系统(例如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的类定义(例如)更改为
class Solr : ISearchTechnology<SolrQuery>
有效。但这在概念上毫无意义。 SolrQuery类型仅与此方法(查询)相关,而不适用于整个类。我可能需要包含其他类型(SolrQuery除外,例如SolrAnswer)。包括所有这些都是混乱的,并且违反了我对这个概念的理解。
我尝试将<T>
部分附加到界面(query<T>(T queryObject)
)中的方法,但我还没有找到任何方法来实际实现它。
最后我想得到以下情况:每个communicator类都按接口的要求实现查询方法,但只接受一个与所有其他通信器类不同的参数的特定类型。
由于
答案 0 :(得分:1)
即使从概念角度来看,您使用ISearchTechnology<T>
的方法也是正确的。
答案 1 :(得分: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>
本身。