2012-02-27 115 views
4
class Result 
{ 
    public string Data { get; set; } 
} 

interface IRepository 
{ 
    Result[] Search(string data); 
} 

我有一個相當通用的接口,搜索「某些東西」並返回Result。接口可以由幾個類來實現,每個類都返回它們自己的Result和它們自己的唯一元數據。例如,我可以有一個DiskRepository對於搜索數據在磁盤上:接口返回派生類型

class DiskResult : Result 
{ 
    public int FileSize { get; set; } 
    public DateTime LastModifiedDate { get; set; } 
} 

class DiskRepository : IRepository 
{ 
    public Result[] Search(string data) 
    { 
     // ... 
     DiskResult[] results = GetDataFromSomewhere(); 
     return results; 
    } 
} 

DiskResult包含的結果是特定於DiskRespository額外信息。如果我創建了另一個實現IRepository的類,那麼該特定實現可能有自己的一組元數據,這些元數據對於該類是唯一的。

最後,我想我的搜索控制器看起來像這樣:

我可以很容易地展示在我ResultData財產,但有一個很好的模式,以顯示元每個課程從Result派生?我可以有一大堆if語句來檢查這個類是否屬於某種類型,但是感覺有點笨拙。有沒有更好的方法去做我想要達到的目標?

回答

0

你可以做IRepository一個通用的接口,如:

interface IRepository<T> 
{ 
    T[] Search(string data); 
} 
0

您可以在結果類virtual方法,這將顯示結果。你的孩子班可以override它,並可以給自己實施。這樣做時,你打電話給Display方法你的Result對象將調用各自的方法來做顯示。

像這樣的事情

class Result 
{ 
    public virtual void Display() 
    { 
      //Your Code 

    } 
    //Your Code 
} 

class DiskResult : Result 
{ 
    public override void Display() 
    { 
      //Your Code 
    } 
    //Your Code 
} 

Display方法

public void Display(string data) 
{ 
    Result[] results = _repositories.Search(data); 

    // Display results 
    foreach(var result in results) 
    { 
     result.Display(); 
    } 

} 

希望這有助於你。

+1

這違反了SRP。演示文稿應該與域分開。 – Eranga 2012-02-27 04:04:07

1

其中一條註釋正確地指出,將虛擬Display()添加到Result類違反了單責任原則。完全正確。

這裏是你的問題的困難:因爲你想要做這樣的事情:

private IRepository[] _repositories; 

...有沒有辦法避免這樣做在運行時類型檢查。編譯器不知道將返回從結果派生的子類。所有它知道你的Repository返回一個Result派生對象。

在另一方面,如果你使用泛型:

interface IRepository<T> where T : Result 
{ 
    T[] Search(string data); 
} 

...你會,在編譯的時候,知道結果的子類型,你正在處理,從而避免進行類型檢查的必要性,以及從第一種方法開始的一連串「if」陳述。

如果你可以使用泛型堅持,那麼你可以做這樣的東西:

interface IResultDisplayService<T> where T : Result 
{ 
    void Display(T result); 
} 

所以,我想我的問題是:它必須保存這些存儲庫的陣列?那裏有什麼真實世界的使用場景?

1

我不會使用該庫的界面,但創建一個新:

public interface ISearchProvider 
{ 
    IEnumerable<SearchResultItem> Search(string keyword); 
} 

public interface ISearchResultItem 
{ 
    string Title {get; } 
    string Description {get; } 
    NameValueCollection Metadata {get; } 
} 

標題和描述應的搜索情況下,90%就足夠了。例如,DiskResult可能包含Description屬性中的文件夾等。元數據可以顯示在工具提示或細節視圖中。

如果這還不夠,我想創建一個渲染界面太:

public interface ISearchResultRenderer 
{ 
    bool IsValidFor(Type type); 
    void Render(Stream stream); 
} 

而且有DiskResultHtmlRenderer實現其經過的元數據和正確的結構它。