Должен ли я выставлять совокупные дочерние элементы как общедоступные свойства для реализации невежества постоянства? - PullRequest
1 голос
/ 26 ноября 2010

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

Недавно я начал изучать доменно-управляемый дизайн, и мне это очень интересно.И я планирую разработать веб-сайт форума с использованием DDD.

Прочитав множество тем, я понял, что постоянное невежество является хорошей практикой.

В настоящее время у меня есть два вопроса о том, что ядолго думаю.

  1. Должен ли объект домена взаимодействовать с хранилищем для получения / сохранения данных?
  2. Если объект домена не использует хранилище, то какУровень инфраструктуры (например, единица работы) знает, какой объект домена новый / изменен / удален?

По второму вопросу.Вот пример кода: Предположим, у меня есть класс пользователя:

public class User
{
 public Guid Id { get; set; }
 public string UserName { get; set; }
 public string NickName { get; set; }

 /// <summary>
 /// A Roles collection which represents the current user's owned roles.
 /// But here i don't want to use the public property to expose it.
 /// Instead, i use the below methods to implement.
 /// </summary>
 //public IList<Role> Roles { get; set; }

 private List<Role> roles = new List<Role>();
 public IList<Role> GetRoles()
 {
    return roles;
 }
 public void AddRole(Role role)
 {
    roles.Add(role);
 }
 public void RemoveRole(Role role)
 {
    roles.Remove(role);
 }
}

Исходя из приведенного выше класса User, предположим, что я получил пользователя из IUserRepository и добавил для него роль.

IUserRepository userRepository;
User user = userRepository.Get(Guid.NewGuid());
user.AddRole(new Role() { Name = "Administrator" });

В этом случае я не знаю, как репозиторий или единица работы могут узнать, что у пользователя есть новая роль?

Я думаю, что ORM-структура реального невежества должна поддерживать POCO, и любойизменения происходят в самом POCO, структура постоянства должна знать автоматически.Даже если изменить состояние объекта с помощью метода (AddRole, RemoveRole), как в примере выше.

Я знаю, что многие ORM могут автоматически сохранять изменения, если я использую свойство Roles , но иногда мне не нравится этот способ из-за соображений производительности.

Может ли кто-нибудь дать мне несколько идей для этого?Спасибо.

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

1 Ответ

1 голос
/ 13 марта 2011

Должен ли объект домена взаимодействовать с хранилищем для получения / сохранения данных?

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

Если объект домена не использует репозиторий, то как слой инфраструктуры (например, единица работы) узнает, какой объект домена новый / изменен / удален?

Простейшая версия - это не так. Вы извлекаете и сохраняете его обратно (после завершения операции над агрегатом) в целом:

var user = users.Find(guid);
user.AssignRole(Role.Administrator);
users.Save(user);

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

Еще одна вещь - подумайте дважды, прежде чем использовать доменно-ориентированный дизайн для разработки форума. Этот подход подходит только для неизвестных (пока) и сложных бизнес-доменов. Это излишне для простых приложений.

И еще - перестань стыдиться своего английского. Это станет лучше в кратчайшие сроки. :)

...