代码之家  ›  专栏  ›  技术社区  ›  Bill

活动记录模式和使用静态方法进行组操作的最佳实践

  •  0
  • Bill  · 技术社区  · 17 年前

    他们关于设计模式的说法是正确的,它们只是已经普遍使用的技术的体现。自1985年以来,我一直在使用活动记录模式。

    此模式的一个属性是在实现中使用静态成员来执行返回基础数据集合的搜索。

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

    在许多需要更大灵活性的情况下,我会打破封装,并包含一个方法,例如

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

    人们会称之为

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

    当然,这是我在C语言中使用这种模式时的遗留问题,显然不是一种最佳实践,如果使用不当,可能会导致SQL注入和其他问题。

    是否有一种合适的模式或实践可以应用,使客户类别成为此类搜索的“标准”?

    例如,假设我想找到客户的姓史米斯,我可能会考虑写一个实现,如:

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

    被称为(当然有合适的构造器):

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

    还是创建一个定义标准的联合类更好?

    4 回复  |  直到 17 年前
        1
  •  1
  •   Gregory A Beamer    17 年前

    从LINQ开始,我喜欢传递表达式而不是字符串。但是,也许那只是我?我也不喜欢ActiveRecord,因为它在同一个对象中混合了状态和行为。很好的包装,但不是模型和数据访问的干净分离。

    我见过客户类被传递到活动记录的情况,但如果你这样做的话,存储库模式会更干净,并将行为和状态分开。然而,我认为使用你在活动记录中已有的投资并传递一个对象并没有错。

    如果你想创建一个criteria类,你会得到一个策略模式,这可以让你的活动记录比现在更活跃。然而,这是一种适用的模式,也将解决任何注入问题。

        2
  •  0
  •   Pesto    17 年前

    虽然它会将您推出数据库级别,但您可以使用类似于比较器的东西。我不知道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") );
    
        3
  •  0
  •   Robert Rossney    17 年前

    如果没有理由不这么做,我会提供这样一种方法:

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

    如果你有不这样做的理由,你需要清楚地说明这些理由,并详细检查它们,以便设计正确的解决方案。

        4
  •  0
  •   Darren Lewis    15 年前

    看看codeplex上的WWPlatform DataAccess示例。它展示了一个极好的例子,可以通过存储库模式将搜索规范实例作为参数提供。

    推荐文章