2012-05-24 22 views
2

我在DAL幾種方法,有相當多的參數:DAL方法有很多的參數

public Collection<Proforma> SearchAllProforma(DateTime? startDate = null, DateTime? endDate = null, 
     int? institutionID = null, int? inspectionID = null, bool? isFollowup = null, bool? excludeDeleted = null, 
     bool? nutritionalOnly = null, int? parentInspectionID = null) 

我應該凝結這些放倒以獲得目標參數?或者使用可選參數讓它們保持原樣?或兩者?

編輯 - 我應該說,這些參數中的每一個映射到存儲過程的參數。

+0

你想在這裏解決什麼問題? – Oded

+1

如果有任何問題,請考慮使用實體框架。 – zmbq

+0

如果您使用的是最新版本的C#,則可以使用命名參數。 –

回答

1

我建議你爲所有這些參數作爲屬性創建一個類:

public List<Personel> GetAll(Func<Personel, bool> predicate = null) 
     { 
      List<Personel> result = new List<Personel>(); 

      if (predicate == null) 
      { 
       result = personelRepo.Table.ToList(); 
      } 
      else 
      { 
       foreach (var item in personelRepo.Table) 
       { 
        if (predicate(item)) 
         result.Add(item); 
       } 
      } 

      return result; 
     } 

,然後打電話時像傳遞謂詞的方法。

然後發送該類作爲參數。

Class SerachAllProformaParameter 
{ 
//All Properties. 
} 

SerachAllProformaParameter parameter= new SerachAllProformaParameter(); 
parameter.PropertyName="value"; 

public Collection<RoIVProforma> SearchAllProforma(parameter); 
+0

我想我會嘗試這種方法,與我現有的方法一起,看看我更喜歡哪一種。我不確定我喜歡調用方法的語法。似乎笨重(特別是在VB.NET中)。 – ScottD

+0

另外,我有很多方法都有很多參數,所以爲這些方法實現大量的類可能需要很多工作。 – ScottD

0

想想看,他們中的很多有缺省值,可用性的觀點看我想補充一些覆蓋此方法與參數不同數量的

通過這種方式,爲您的方法的消費者會更容易選擇合適的一個,而不必在眼裏所有參數在智能感知窗口的前面。

public Collection<RoIVProforma> SearchAllProforma(DateTime? startDate = null) 
{ 
    ... 
} 

public Collection<RoIVProforma> SearchAllProforma(DateTime? startDate = null, DateTime? endDate = null) 
{ 
... 
} 

public Collection<RoIVProforma> SearchAllProforma(DateTime? startDate = null, DateTime? endDate = null, 
     int? institutionID = null) 
{ 
... 
} 

... 
+0

我沒有看到爲已經有每個參數爲可選的方法添加多個重載的優勢。只是看起來像額外的噪音和我必須保持的東西。 – ScottD

+0

@ScottD:正如我寫的,好處是當你寫「。」在intellisense中,您看不到所有這些參數,但是像第一個選項會看到沒有參數的方法,並且可以使用「<" and ">」進行其他定義。 – Tigran

0

我應該凝結這些放倒以獲得目標參數?

是的,絕對。看着這個方法簽名讓我的眼睛開始流血。

+0

這也是一個溫和的例子。 – ScottD

+0

你的意思是你有更多的參數? –

+0

我有更多參數的方法比。 – ScottD

0

就個人而言,最好的方法是將Expression<Func<RoIVProforma, bool>>實例傳遞給SearchAllProforma方法。但如果您的DAL不使用任何基於LINQ的基礎數據源,則實現解析表達式會更加困難。
同時,具有許多可選參數的方法是最差的。

0

使用對象作爲參數,這是一個好辦法..

1

我應該凝結這些放倒以獲得目標參數?

不一定。默認值似乎沒問題(我假設你的函數可以處理null參數沒有問題)。如果您使用的是C#的最新版本,則可以調用此功能,如:

SearchAllProforma(institutionID: 33); 

在我看來,這並不是那麼糟糕。

+0

這正是我稱之爲方法的方式。 – ScottD

0

如果所有參數都屬於您的某個實體,則可以將謂詞lambda表達式傳遞給該方法。

我使用以下方法在我的實體中搜索一些條件。

var myFilteredEntities = GetAll(e => e.Name == "John" && e.IsMarried == false);