DDD: набор и репозитории объекта

Проблема могла бы также состоять в том, что DVD шифруется.

Вам нужен libdvdread4 пакет, который должен быть установлен в Ubuntu 12.04, но который должен быть настроен для работы. Выполните эту команду в Терминале

sudo /usr/share/doc/libdvdread4/install-css.sh

и попытку играть DVD снова.

можно получить еще некоторый infos здесь в официальной Ubuntu Wiki.

13
задан queen3 3 September 2009 в 11:19
поделиться

5 ответов

Имея коллекцию Items и , имеющих методы GetXXX () , оба правильны.

Чтобы быть чистым, ваш У сущностей не должно быть прямого доступа к репозиториям. Однако они могут иметь косвенную ссылку через Спецификацию запроса . Посмотрите страницу 229 книги Эрика Эванса. Примерно так:

public class Product
{
    public IList<Item> Items {get;}

    public int GetMaxItemSmth()
    {
        return new ProductItemQuerySpecifications().GetMaxSomething(this);
    }
}

public class ProductItemQuerySpecifications()
{
   public int GetMaxSomething(product)
   {
      var respository = MyContainer.Resolve<IProductRespository>();
      return respository.GetMaxSomething(product);
   }
}

Как получить ссылку на Репозиторий - это ваш выбор (DI, Service Locator и т. Д.). Хотя это удаляет прямую ссылку между Entity и Respository, это не уменьшает LoC.

Как правило, я бы представил его раньше, если бы знал, что количество методов GetXXX () вызовет проблемы в будущем. В противном случае я бы оставил это для будущего рефакторинга.

5
ответ дан 2 December 2019 в 00:18
поделиться

(Отказ от ответственности, я только начинаю понимать DDD. Или, по крайней мере, верю, что делаю это :))

Я буду вторым Марком по этому вопросу и выделю 2 пункта, которые потребовали мне несколько раз, чтобы осознать.

  • Подумайте о своем объекте в терминах совокупностей, которые приводят к

    Дело в том, что либо вы загружаете дочерние элементы вместе с родителем, либо загружаете их по отдельности

Сложная часть состоит в том, чтобы подумать об агрегате для вашей проблемы, а не сосредоточиться на структуре БД, поддерживающей его.
Пример, подчеркивающий этот момент i customer.Orders. Вам действительно нужны все заказы вашего клиента для добавления нового заказа? обычно нет. что, если у нее их 1 миллион?
Вам может потребоваться что-то вроде OutstandingAmount или AmountBuyedLastMonth для выполнения некоторых сценариев, таких как AcceptNewOrder или ApplyCustomerCareProgram.

  • Является ли продукт настоящей совокупной корневой записью для вашего сценария?

    Что делать, если продукт не является совокупным корнем?

т.е. собираетесь ли вы манипулировать предметом или продуктом?
Если это продукт, нужен ли вам ItemWithMaxSomething или вам нужен MaxSomethingOfItemsInProduct?

  • Еще один миф: PI означает, что вам не нужно думать о БД

Учитывая, что вам действительно нужен элемент с maxSomething в вашем сценарии, вам нужно знать, что это означает с точки зрения работы с базой данных, чтобы выберите правильную реализацию - через службу или свойство.
Например, если в продукте огромное количество элементов, решением может быть запись идентификатора элемента вместе с продуктом в базу данных вместо повторения по всему списку.

Сложная часть для меня в DDD - это определить правильные агрегаты. Я все больше и больше чувствую, что если мне нужно полагаться на ленивую загрузку, то я мог пропустить некоторую границу контекста.

надеюсь, что это поможет :)

3
ответ дан 2 December 2019 в 00:18
поделиться

Другой способ решить эту проблему - отслеживать все это в совокупном корне. Если Product и Item являются частью одного и того же агрегата, причем Product является корневым, то весь доступ к элементам контролируется через Product. Итак, в своем методе AddItem сравните новый элемент с текущим максимальным элементом и при необходимости замените его. Сохраняйте его там, где это необходимо в продукте, чтобы вам вообще не приходилось выполнять SQL-запрос. Это одна из причин, почему определение агрегатов способствует инкапсуляции.

1
ответ дан 2 December 2019 в 00:18
поделиться

Я думаю, что это сложный вопрос, на который нет точного и быстрого ответа.

Ключ к одному ответу - для анализа агрегатов и ассоциаций, как описано в Domain-Driven Design . Дело в том, что либо вы загружаете потомков вместе с родителем , либо вы загружаете их отдельно.

Когда вы загружаете их вместе с родителем (Product в вашем примере), родитель управляет всем доступом к потомкам, включая операции поиска и записи. Следствием этого является то, что не должно быть репозитория для дочерних элементов - доступ к данным управляется родительским репозиторием.

Итак, чтобы ответить на один из ваших вопросов: «Зачем мне вообще нужна эта коллекция в Продукте?» Возможно, вы этого не сделаете, но если вы это сделаете, это будет означать, что элементы будут всегда загружаться при загрузке продукта. Вы можете реализовать метод Max, который просто находил бы Max, просматривая все элементы в списке. Возможно, это не самая производительная реализация, но это был бы способ сделать это, если бы Продукт был агрегированным корнем.

Что делать, если Продукт не агрегированный корень? Что ж, первое, что нужно сделать, это удалить свойство Items из продукта. Затем вам понадобится какая-то служба, которая может извлекать элементы, связанные с продуктом. Такая служба также может иметь метод GetMaxItemSmth.

Примерно так:

public class ProductService
{
    private readonly IItemRepository itemRepository;

    public ProductService (IItemRepository itemRepository)
    {
        this.itemRepository = itemRepository;
    }

    public IEnumerable<Item> GetMaxItemSmth(Product product)
    {
        var max = this.itemRepository.GetMaxItemSmth(product);
        // Do something interesting here
        return max;
    }
}

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

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

Что делать, если продукт не агрегированный корень? Что ж, первое, что нужно сделать, это удалить свойство Items из продукта. Затем вам понадобится какая-то служба, которая может извлекать элементы, связанные с продуктом. Такая служба может также иметь метод GetMaxItemSmth.

Примерно так:

public class ProductService
{
    private readonly IItemRepository itemRepository;

    public ProductService (IItemRepository itemRepository)
    {
        this.itemRepository = itemRepository;
    }

    public IEnumerable<Item> GetMaxItemSmth(Product product)
    {
        var max = this.itemRepository.GetMaxItemSmth(product);
        // Do something interesting here
        return max;
    }
}

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

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

Что делать, если продукт не агрегированный корень? Что ж, первое, что нужно сделать, это удалить свойство Items из продукта. Затем вам понадобится какая-то служба, которая может извлекать элементы, связанные с продуктом. Такая служба может также иметь метод GetMaxItemSmth.

Примерно так:

public class ProductService
{
    private readonly IItemRepository itemRepository;

    public ProductService (IItemRepository itemRepository)
    {
        this.itemRepository = itemRepository;
    }

    public IEnumerable<Item> GetMaxItemSmth(Product product)
    {
        var max = this.itemRepository.GetMaxItemSmth(product);
        // Do something interesting here
        return max;
    }
}

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

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

Первое, что нужно сделать, это удалить свойство Items из продукта. Затем вам понадобится какая-то служба, которая может извлекать элементы, связанные с продуктом. Такая служба может также иметь метод GetMaxItemSmth.

Примерно так:

public class ProductService
{
    private readonly IItemRepository itemRepository;

    public ProductService (IItemRepository itemRepository)
    {
        this.itemRepository = itemRepository;
    }

    public IEnumerable<Item> GetMaxItemSmth(Product product)
    {
        var max = this.itemRepository.GetMaxItemSmth(product);
        // Do something interesting here
        return max;
    }
}

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

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

Первое, что нужно сделать, это удалить свойство Items из продукта. Затем вам понадобится какая-то служба, которая может извлекать элементы, связанные с продуктом. Такая служба может также иметь метод GetMaxItemSmth.

Примерно так:

public class ProductService
{
    private readonly IItemRepository itemRepository;

    public ProductService (IItemRepository itemRepository)
    {
        this.itemRepository = itemRepository;
    }

    public IEnumerable<Item> GetMaxItemSmth(Product product)
    {
        var max = this.itemRepository.GetMaxItemSmth(product);
        // Do something interesting here
        return max;
    }
}

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

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

Затем вам понадобится какая-то служба, которая может извлекать элементы, связанные с продуктом. Такая служба также может иметь метод GetMaxItemSmth.

Примерно так:

public class ProductService
{
    private readonly IItemRepository itemRepository;

    public ProductService (IItemRepository itemRepository)
    {
        this.itemRepository = itemRepository;
    }

    public IEnumerable<Item> GetMaxItemSmth(Product product)
    {
        var max = this.itemRepository.GetMaxItemSmth(product);
        // Do something interesting here
        return max;
    }
}

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

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

Затем вам понадобится какая-то служба, которая может извлекать элементы, связанные с продуктом. Такая служба также может иметь метод GetMaxItemSmth.

Примерно так:

public class ProductService
{
    private readonly IItemRepository itemRepository;

    public ProductService (IItemRepository itemRepository)
    {
        this.itemRepository = itemRepository;
    }

    public IEnumerable<Item> GetMaxItemSmth(Product product)
    {
        var max = this.itemRepository.GetMaxItemSmth(product);
        // Do something interesting here
        return max;
    }
}

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

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

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

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

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

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

2
ответ дан 2 December 2019 в 00:18
поделиться

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

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

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

0
ответ дан 2 December 2019 в 00:18
поделиться
Другие вопросы по тегам:

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