Должны ли репозитории использовать объекты или примитивы? - PullRequest
2 голосов
/ 11 октября 2011

Я заметил, что на самом деле нет никакого смысла или причины для того, чтобы мои репозитории принимали объекты или примитивы в качестве параметров, или же методы CREATE возвращали просто int (идентификатор из БД) или полноценный объект.

Итак, мой вопрос: должны ли хранилища проходить и возвращать объекты или примитивы? Какой совет вы можете дать по этому вопросу? Можете ли вы поделиться какими-либо подводными камнями или опытом с любым из этих подходов?

Пример:

public class ProductRepository : IProductRepository
{
                // Pass in the whole object to the repo method...?
    public int Add(Product product)
    {
        // return just the productId...?
    }

                    // Pass in the individual primitive values...?
    public Product Add(string productName, decimal productPrice, string description)
    {
        // return the whole Product object...?
    }
}

Как насчет того, нужна ли информация от нескольких объектов? Конечно, с точки зрения ООП лучше обойти объекты здесь, нет? (Я здесь дерзкий ...)

public int Add(int merchantId, Product product)
{
    // database call needs merchant info...
}

public int Add(Merchant merchant, Product product)
{
    var merchantId = merchant.ID;
    // database call needs merchant info...
}

Ответы [ 3 ]

5 голосов
/ 11 октября 2011

как правило, через короткое время вы увидите (если вы используете несколько репозиториев), что это сам шаблон и его можно реорганизовать в какой-то базовый класс (для доступа к данным). Но для того, чтобы сделать это, вы не сможете задать расширенные параметры для добавления / обновления и т. Д. (И вы не должны - просто подумайте об объекте с более чем 10 свойствами), но только шаблон с самим объектом.

Так что используйте вариант 1;)

2 голосов
/ 11 октября 2011

Хранилище и фабрика - это разные понятия. Фабрика отвечает за создание объектов; репозиторий отвечает за взятие созданных в другом месте объектов и добавление их в хранилище данных.

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

0 голосов
/ 11 октября 2011

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

...