Что хорошего. Похоже, у вас есть productChecker с хорошей четкой целью. Проверьте продукты. Вы бы рефакторинг или изменить это, потому что у вас есть необходимость. Если вам не нужно, вы бы не стали. Вот что я, вероятно, сделал бы.
Это "кажется" неуклюжим для создания нового экземпляра класса для каждого номера учетной записи. Аргумент конструктора должен быть чем-то необходимым для правильного поведения класса. Это параметр класса, а не зависимость. Это приводит к искушению проделать большую работу в конструкторе. Использование класса должно выглядеть так:
result = new ProductChecker().ProductACriteriaPassed(accountNumber)
Который я бы быстро переименовал, чтобы указать, что он работает.
result = new ProductChecker().PassesProductACriteria(accountNumber)
Несколько других отметили, что вы можете разделить логику базы данных. Вы хотели бы сделать это, если вы хотите быстрые юнит-тесты. Большинству программ нужны юнит-тесты (если только вы не играете), и они лучше, если они быстрые. Они быстры, когда вы можете убрать базу данных с дороги.
Давайте создадим фиктивный объект, представляющий результаты базы данных, и передадим его методу, который определяет, проходит ли продукт. Если бы не тестируемость, это было бы личное. Тестируемость побеждает. Предположим, я хочу проверить правило, такое как «продукт должен быть зеленым, если номер счета простое». Такой подход к модульному тестированию прекрасно работает без красивой инфраструктуры.
// Maybe this is just a number of items.
DataRequiredToEvaluateProduct data = // Fill in data
// Yes, the next method call could be static.
result = new ProductChecker().CheckCriteria(accountNumber, data)
// Assert result
Теперь нам нужно подключить базу данных. База данных является зависимостью, она необходима для правильного поведения класса. Это должно быть предусмотрено в конструкторе.
public class ProductRepository {} // Define data access here.
// Use the ProductChecker as follows.
result = new ProductChecker(new ProductRepository()).CheckCriteria(accountNumber)
Если конструктор становится слишком длинным (вероятно, ему нужно прочитать конфигурационный файл, чтобы найти базу данных), создайте фабрику, чтобы разобраться за вас.
result = ProductCheckerFactory().GimmeProductChecker().CheckCriteria(accountNumber)
Пока что я не использовал какой-либо инфраструктурный код. Как правило, мы делаем это проще и красивее с помощью насмешек и внедрения зависимостей (я использую rhinomocks и autofac ). Я не буду вдаваться в это. Это проще, если оно уже у вас на месте.