0

さまざまな検索システム (Apache Solr、SQL DB など) との通信に使用する小さなインフラストラクチャをセットアップしています。システムごとに、共通のインターフェースを実装する 1 つの個別のクラス (="communicator") を用意して、後続のアプリケーションがすべての検索システムと同じ方法で「対話」できるようにします。さらに、各検索システムには、実際のクエリを作成するために使用する独自のクラスがあります。その個々のクエリ クラスのオブジェクトは、関連するすべてのクエリ パラメータを保持し、対応するコミュニケータ クラスに渡されます。したがって、Solr の場合は次のようになります。

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

ここまでは順調ですね。しかし、インターフェイスで query-method を指定するにはどうすればよいでしょうか? Solr クラスは SolrQuery 型のオブジェクトを想定しています。MySQL クラスは、タイプ MySQLQuery のオブジェクトを想定しています。

私が望むことを行う1つの解決策はこれです:私はこのようにインターフェース全体を変更します:

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

次に、Solrのクラス定義(例)を次のように変更します

class Solr : ISearchTechnology<SolrQuery>

それはうまくいきます。しかし、これは概念的に意味がありません。タイプ SolrQuery は、クラス全体ではなく、この 1 つのメソッド (クエリ) にのみ関連します。含める必要がある他のタイプ (SolrQuery 以外、たとえば SolrAnswer) があるかもしれません。このようなものをすべて含めると混乱し、概念に対する私の理解に違反します。

<T>インターフェイスのメソッドにパーツをアタッチしようとしましたが ( query<T>(T queryObject))、実際に実装する方法が見つかりませんでした。

最終的には、次のような状況が必要です。各コミュニケーター クラスは、インターフェイスの要求に応じてクエリ メソッドを実装しますが、他のすべてのコミュニケーター クラスとは異なる、パラメーターに対して 1 つの特定の型のみを受け入れます。

ありがとう

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 に答える