[英]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.