我有幾個支付交易基類型(信用卡,支票,現金,billMeLater等)的子類。每個子類都有它自己的存儲庫,因爲每個子類都有自己的屬性和獲取方式。我需要能夠搜索付款交易,並且走了一條導致更多頭痛的道路。訣竅是有時客戶需要搜索常見的屬性,如金額或客戶名稱,有時客戶需要搜索支付類型特定的屬性,如信用卡號碼或銀行路由號碼......但域級搜索方法需要能夠返回所有類型的交易基礎。如何使用存儲庫模式搜索子類?
我有抽象以下級別:
與SearchTransactions WCF層()方法。
帶有SearchTransactions()方法的域圖層。
具有多個存儲庫的數據層,每個存儲庫都有一個Search()方法 (支付類型特定)。
數據庫(通過EF)與典型的DBA需要不知所云亂七八糟
你會怎麼做呢?
編輯:
爲了增加背景下,這裏有可能支付類型的一些例子,他們的基地:
public abstract class TransactionBase
{
public int TransactionId { get; set; }
public decimal Amount { get; set; }
}
public class CreditCardTransaction : TransactionBase
{
public string CardNumber { get; set; }
public int ExpirationMonth { get; set; }
public int ExpirationYear { get; set; }
}
public class CheckTransaction : TransactionBase
{
public string BankAccountNumber { get; set; }
public string RoutingNumber { get; set; }
}
因此,客戶端應該能夠在CardNumber,RoutingNumber,金額搜索等等,全部來自一種方法。如果客戶在金額上搜索(基於參數),該方法應該返回CreditCardTransaction和CheckTransaction。如果客戶在BankAccountNumber上搜索,它應該只返回CheckTransactions。
客戶的需求,並儘早解決:
客戶要求有一個呼叫搜索多種交易類型。客戶不關心他們作爲參數傳入的內容,除非他們需要多個電話來覆蓋所有支付類型。我之前的一個想法是使用帶有搜索標準的類。然後,我可以有搜索標準類的子類搜索更具體的付款類型屬性。就像這樣:
public class TransactionSearchCriteriaBase
{
public int TransactionId { get; set; }
public decimal Amount { get; set; }
}
public class CreditCardTransactionSearchCriteria : TransactionSearchCriteriaBase
{
public string CardNumber { get; set; }
public int ExpirationMonth { get; set; }
public int ExpirationYear { get; set; }
}
因此,如果客戶希望在像金額公共屬性進行搜索,他們通過在TransactionSearchCriteriaBase。如果他們通過CreditCardTransactionSearchCriteria,他們最終會搜索信用卡交易。例如:
var listOfTransactions = _transactionService.Search(new CreditCardTransactionSearchCriteria{ Amount = 10m, CardNumber = "1111" });
我取代了幾乎不可避免開關/如果與存儲庫工廠塊交回基於標準的類型適用儲存庫的清單到工廠對象通過。
兔子洞更深。我想少一個兔子洞。
信息的另一片:
由於我們在EF 3.5這樣做,我們沒有POCO的支持。所以,我們不會將EF生成的對象視爲域對象。我們的存儲庫將各種斷開連接的EF對象映射到域對象,並將它們返回給調用它們的域服務。
我想出的一個解決方案我認爲並不是很糟糕的事情就是擁有一個事務存儲庫工廠,它爲我提供了適用的事務存儲庫列表。然後我可以搜索每個回購並將結果添加到List。思考? –
客戶端需要返回多個事務類型的「神奇」方法。我寧願提供多個方法調用,因爲那樣我就可以將它全部通用化並且可以完成它。不幸的是,我被卡住了「魔法」。 –
@Byron - 你可以用客戶端的一些示例調用來更新你的問題嗎? – RPM1984