Лучшие практики для Active Record Pattern и использования статических методов для групповых операций - PullRequest
0 голосов
/ 12 марта 2009

Это правда, что они говорят о шаблонах проектирования, что они являются просто воплощением техник, уже широко используемых. Я использую шаблон активной записи с 1985 года.

Одним из атрибутов этого шаблона является использование статических элементов в реализации для выполнения поиска, который возвращает коллекции базовых данных.

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

Во многих случаях, когда мне нужна большая гибкость, я нарушаю инкапсуляцию и включаю такой метод, как

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

, где его можно назвать

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

Конечно, это откладывание, когда я использовал этот шаблон в C, это явно не лучшая практика, и в неправильных руках это может привести к внедрению SQL и другим проблемам.

Существует ли подходящий шаблон или практика, которая могла бы позволить классу Customer стать «критерием» для такого поиска?

Например, предположим, что я хочу найти клиентов, чья фамилия была Смит, я мог бы написать такую ​​реализацию, как:

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

должен вызываться как (с соответствующим конструктором, конечно):

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

Или лучше создать совместный класс, который бы определял критерии?

Ответы [ 4 ]

1 голос
/ 12 марта 2009

Просто из работы с LINQ мне нравится идея передавать выражение вместо строки. Но, может быть, это только я? Мне также не нравится ActiveRecord, так как он смешивает состояние и поведение в одном и том же объекте. Хорошая упаковка, но не четкое разделение модели и доступа к данным.

Я видел случаи, когда класс клиента передается в активную запись, но если вы идете по этому пути, шаблон хранилища намного чище и отделяет поведение от состояния. Однако я не вижу ничего плохого в использовании инвестиций, которые вы уже вложили в активную запись, и передаче объекта.

Если вы хотите создать класс критериев, у вас получится немного паттерна стратегии, который может сделать вашу активную запись немного более активной, чем сегодня. Однако это применимый шаблон, который также решит любые проблемы с инъекцией.

0 голосов
/ 12 августа 2010

Посмотрите на пример WWPlatform DataAccess на codeplex. Он показывает отличный пример предоставления экземпляров спецификации поиска в виде параметров, хотя и через шаблон хранилища.

0 голосов
/ 12 марта 2009

Без причины, я бы предоставил такой метод:

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

Если у вас есть причины не делать этого, вам необходимо четко сформулировать эти причины и изучить их подробно, чтобы разработать правильное решение.

0 голосов
/ 12 марта 2009

Хотя это отталкивает вас от уровня базы данных, вы можете использовать нечто похожее на компаратор. Я не знаю 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") );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...