簡體   English   中英

Active Record模式的最佳做法,以及使用靜態方法進行組操作

[英]Best practices for Active Record Pattern and using static methods for group operations

他們對設計模式的評價確實是,它們只是已經普遍使用的技術的體現。 自1985年以來,我一直在使用Active Record Pattern。

此模式的屬性之一是在實現中使用靜態成員來執行返回基礎數據集合的搜索。

class Customer { 
   static Customer FindCustomerById( int Id ) { ... } 
   static Customer[] FindActiveCustomers() { ... }
}

在很多情況下,我需要更大的靈活性,因此我破壞了封裝並加入了諸如

static Customer[] FindCustomers( string criteria ) { ... } 

人們會稱之為

Customer[] customers = Customer.FindCustomers( "LastName = 'Smith'" );

當然,這是我在C語言中使用此模式時遇到的問題,顯然不是最佳實踐,如果使用不當,會導致SQL注入和其他問題。

是否有合適的模式或做法可以應用,以使Customer類成為此類搜索的“標准”?

例如,假設我要查找姓氏為Smith的客戶,則可以考慮編寫一個實現,例如:

static Customer[] FindCustomers( Customer customer ) { ... }

被稱為(當然有適當的構造函數):

Customer[] customersnamedsmith = 
   Customer.FindCustomer( new Customer( "Smith" ) );

還是創建一個可以定義條件的共同類更好?

僅僅通過使用LINQ,我就喜歡傳遞表達式而不是字符串的想法。 但是,也許就是我嗎? 我也不喜歡ActiveRecord,因為它在同一對象中混合了狀態和行為。 包裝精美,但沒有將模型和數據訪問完全分開。

我已經看到了將客戶類傳遞到活動記錄的情況,但是如果您按照這種路線進行操作,則存儲庫模式會更加整潔,並且會將行為與狀態分開。 但是,我認為使用已在活動記錄中擁有的投資並傳遞對象沒有錯。

如果您想創建一個條件類,那么您將獲得一些策略模式,這可以使您的活動記錄比今天的活動記錄更活躍。 但是,這是適用的模式,並且還將解決任何注入問題。

看看codeplex上的WWPlatform DataAccess示例。 它顯示了一個很好的示例,盡管通過存儲庫模式也可​​以將搜索規范實例作為參數提供。

盡管它使您脫離數據庫級別,但可以使用類似於比較器的功能。 我不了解C#,所以我只是捏捏了一下,但您明白了要點:

class CustomerLastNameEvaluator : IEvaluate
{
    private Customer _customer;

    public CustomerLastNameEvaluator (String lastName)
    {
        _customer = new Customer (lastName);
    }

    bool IEvaluate.Evaluate(Customer c)
    {
        return (_customer.LastName == c.LastName);
    }
}

Customer[] customers = Customer.FindCustomers( new CustomerLastNameEvaluator("Smith") );

沒有理由,我會提供這樣的方法:

public static IEnumerable<Customer> AllCustomers()
{
   return Customers.AsEnumerable();
}

如果您有理由不這樣做,則需要闡明這些原因並詳細檢查它們,以設計正確的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM