При работе с моделями предметной области и ПОСТЕПЕННО классами, куда запросы идут?

Вот объяснение того, что пошло не так. Это был результат вашего селектора. Странность в том, как он воспроизводился, была вызвана вашей HTML-структурой и использованием querySelector.

div.rules :nth-child()

Сначала будет выбран целевой элемент <div class="rules">. Затем он будет искать всех элементов, которые являются n-ными дочерними элементами внутри этого div из-за пространства между двумя селекторами. После этого, используя querySelector, вы выберете первый элемент соответствующего набора.

Вот почему вы в итоге получили первый <div> с :nth-child(1), потому что он на самом деле соответствовал каждому отдельному nth-child (1), но получение первого результата было совпадением с ожидаемым вами элементом.

Тем не менее, :nth-child(2) соответствие каждому второму дочернему элементу было слишком широким, и в итоге он получил второго дочернего элемента в первом элементе div, и, поскольку это был первый результат, именно там был красный фон появился.

Последнее любопытство :nth-child(3), казалось бы, действительно ударило по нужному элементу, было только потому, что во всем этом html есть только один третий дочерний элемент, и это был тот, который вы ожидали, хотя, как объяснялось по причинам, отличным от предполагаемых .

7
задан 6 February 2009 в 18:48
поделиться

5 ответов

Объекты области должны быть независимы от устройства хранения данных, необходимо использовать шаблон Repostiory или ДАО для сохранения объектов. Тем путем Вы осуществляете разделение проблем, сам объект не должен знать о том, как это хранится.

Идеально, это была бы хорошая идея вставить конструкцию запроса репозитория, хотя я буду использовать ORM внутри там.

Вот определение Martin Fowler Шаблона Репозитория.

3
ответ дан 7 December 2019 в 10:08
поделиться

Объекты являются "единицами" домена. Репозитории и сервисы ссылаются на них, не наоборот. Думайте об этом этот путь: Вы несете DMV в своем кармане?

OrderItem не совокупный корень; это не должно быть доступно через репозиторий. Его идентификационные данные локальны для Order, значение Order всегда будет в объеме при разговоре о OrderItems.

Трудность нахождения дома для запросов приводит меня думать о сервисах. В этом случае они представили бы что-то о Order это трудно для Order самостоятельно знать.

Объявите намерение в доменном проекте:

public interface ICheapestItemService
{
    OrderItem GetCheapestItem(Order order);
}

public interface IInventoryService
{
    IEnumerable<OrderItem> GetOutOfStockItems(Order order);
}

Объявите реализацию в проекте данных:

public class CheapestItemService : ICheapestItemService
{
    private IQueryable<OrderItem> _orderItems;

    public CheapestItemService(IQueryable<OrderItem> orderItems)
    {
        _orderItems = orderItems;
    }

    public OrderItem GetCheapestItem(Order order)
    {
        var itemsByPrice =
            from item in _orderItems
            where item.Order == order
            orderby item.Price
            select item;

        return itemsByPrice.FirstOrDefault();
    }
}

public class InventoryService : IInventoryService
{
    private IQueryable<OrderItem> _orderItems;

    public InventoryService(IQueryable<OrderItem> orderItems)
    {
        _orderItems = orderItems;
    }

    public IEnumerable<OrderItem> GetOutOfStockItems(Order order)
    {
        return _orderItems.Where(item => item.Order == order && !item.InStock);
    }
}

Этот пример работает с любым поставщиком LINQ. С другой стороны, проект данных мог использовать NHibernate's ISession и ICriteria сделать грязную работу.

3
ответ дан 7 December 2019 в 10:08
поделиться

Поскольку я понимаю этот стиль дизайна, Вы инкапсулировали бы запрос в методе OrderItemRepository (или возможно более соответственно OrderRepository) объект, ответственность которого состоит в том, чтобы говорить с DB на одной стороне и возвратить объекты OrderItem с другой стороны. Репозиторий скрывает детали DB от потребителей экземпляров OrderItem.

2
ответ дан 7 December 2019 в 10:08
поделиться

На уровне служб.

-2
ответ дан 7 December 2019 в 10:08
поделиться

Я утверждал бы, что не имеет смысла говорить о "Порядке, который содержит только OrderItems, которые не находятся в запасе". "Порядок" (я предполагаю), представляет полный список того, что заказал клиент; при фильтрации того списка, Вы больше не имеете дело с Порядком по сути, Вы имеете дело с фильтрованным списком OrderItems.

Я думаю, что вопрос становится, хотите ли Вы действительно рассматривать Заказы как Совокупный Корень, или хотите ли Вы смочь вытащить произвольные списки OrderItems из Вашего уровня доступа к данным также.

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

Если это - действительно не случай, и необходимо просочиться база данных, то можно хотеть рассмотреть наличие отдельного репозитория OrderItem, который обеспечил бы, запросы как "дают мне все OrderItems для этого Порядка, которые не находятся в запасе". Вы затем возвратили бы тех как IList<OrderItem> (или IEnumerable<OrderItem>), так как они не полный Порядок, а скорее некоторый фильтрованный набор OrderItems.

0
ответ дан 7 December 2019 в 10:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: