2012-07-25 49 views
0

我設置的是我用不同的搜索引擎(例如Apache Solr實現,SQL數據庫等)進行通信的小型基礎設施實現方法 (T)。對於每個系統,我都有一個單獨的類(=「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))中的方法,但我還沒有找到任何方法來實際實現它。

在欲有以下的情況結束:每個通信器類實現查詢方法所要求的接口,但只接受是從所有其他通信類不同的參數的一個特定類型。

感謝

+0

歡迎堆棧溢出。您是否可以提供一些您試圖實施的搜索系統的參考信息?你在那裏談論SQL DB,但那不是很具體。有已通過[.NET數據提供程序在.NET提供的數據抽象(http://msdn.microsoft.com/en-us/library/a6cd7c08.aspx) – Kivin 2012-07-25 06:55:58

+0

Solr的和SQL真的是隻引進依賴的例子。我的問題只針對接口,實現它的類和用作參數的多個類型之間的關係。 – Jan 2012-07-25 07:17:37

回答

1

您與ISearchTechnology<T>的做法是正確的,甚至從概念的角度來看。

+0

在我看來,這是* *的答案海報的問題,「但我怎麼指定接口的查詢方法?」。 – 2012-07-25 06:55:57

+0

你是對的,我的錯。對不起。 – Kivin 2012-07-25 06:56:45

+0

這真的是唯一的選擇嗎?我覺得不直觀。我想僅將類型綁定到單個方法,而不是整個類。 – Jan 2012-07-25 07:15:21

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>

+0

可以將返回類型(如果變量)添加到接口的通用參數:ITechnology 。 – Kivin 2012-07-25 07:28:50

相關問題