2010-09-24 49 views
1

我有一個接口專用類參數

interface IRepository<T> 
{ 
    List<T> GetAll(string id) 
    List<T> GetAll(string id, string desc) 
    List<T> GetAll(string id, string desc, int[] status) 
    List<T> GetAll(string id, string desc, int[] status, ....) 
} 

我的許多種類是實現了這個接口。我的問題是,更常見的情況是,當客戶請求定製時,我通常需要在方法上添加參數。所以當我有10個類實現這個接口時,我還需要更新每個繼承接口的類(我使用抽象工廠模式),這非常麻煩。而且它也不是很喜歡看到許多方法重載像上面的例子,imo。是否有任何解決方案/解決方法使參數動態(旁邊的param []選項,我不喜歡)。我的意思是像一個專用的類/接口參數,所以當我添加參數時,我不需要重載該方法。像這樣

interface IRepository<T> 
    { 
    List<T> GetAll(Parameter args); 
    } 

的放慢參數類(或者接口)的客戶

class Client1Accounts : IRepository<Employee> 
    { 
     List<Employee> GetALl(Parameter param) 
     { 
      return DataFactory.GetAllById(param.Id); 
     } 
    } 

    class Client2Accounts : IRepository<Employee> 
    { 
     List<Employee> GetALl(Parameter param) 
     { 
      return DataFactory.GetAllByDesc(param.Desc); 
     } 
    } 


    class Client2Accounts : IRepository<Employee> 
    { 
     List<Employee> GetALl(Parameter param) 
     { 
      int[] status = { 99, 88 } 
      return DataFactory.GetAllFiltered(param.Id, param.Desc, status); 
     } 
    } 

這樣,當我需要添加參數,我會

static class Parameter 
    { 
    public string Id { get; set; } 
    public string Desc { get; set; } 
    public int[] Status { get; set; } 
    } 

樣本實現只需添加另一個屬性到參數類

static class Parameter 
    { 
    public string Id { get; set; } 
    public string Desc { get; set; } 
    public int[] Status { get; set; } 
    public long newLongParam { get; set; } 
    } 

這種方法是否正確?任何其他想法?

回答

1

這種感覺對我來說,存儲庫不會真的來實現其精神十足的界面,如果他們只用參數的部分,忽略其它。在一些案件是有道理的,但在這種情況下它看起來不像。

接口的要點是調用者不需要關心實現是什麼樣的 - 它可以用相同的方式處理每個實現。

舉例來說,如果給予Client1Accounts實例的調用者看起來很困惑,如果他們試圖通過描述進行搜索,只會發現描述被完全忽略。

如果不同的呼叫者確實需要通過不同的東西進行搜索,單個接口是否真的給你帶來了很多價值?

「引入一種新的參數」的想法很好本身 - 但我認爲,當應用於這種設計時,它會咬你長遠。

(如果你有興趣在「引入新類型」的格局,有框架中的例子 - ProcessStartInfo可能是我能想到的立即最好的一個。)

+0

也許我不需要爲此提供一個接口,但是您的建議是什麼?在這種情況下,clientA只能傳遞ID,而clientB只能傳遞Desc,但它們都希望得到相同的數據?謝謝^^ – CSharpNoob 2010-09-24 17:52:53

+0

@CSharpNoob:他們都希望得到相同的數據,但是如果不同的客戶端可以傳遞不同類型的數據,那麼任何*適當的*實現都將不得不應對*所有*這些請求......你已經給予只會應付特定類型的來電者。這不是接口工作的方式。 – 2010-09-24 18:01:24

0

如何:

public interface IRepository<T> 
{ 
    IQueryable<T> GetAll(); 
} 
+0

你能給我舉個例子嗎?這個接口如何解決我的問題?對不起,我還沒有使用此接口呢..謝謝 – CSharpNoob 2010-09-24 17:54:15

+0

現代的ORMs,如NHibernate和Linq to Entities提供了這個接口的示例實現,允許您將查詢轉換爲SQL。他們返回一個懶惰的結果集,然後可以根據不同的標準進行過濾。 – 2010-09-24 18:00:00

0

您可以使用1個參數製作1個方法。這1個參數是一個字符串數組。這就是許多P語言的主要功能。但是,如果您有陣列和對象參數,可能會煩惱將所有參數從字符串轉換爲字符串。