2010-11-26 1 views
1

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

В последнее время я начал изучать дизайн, основанный на домене, и меня это очень интересует. И я планирую создать сайт форума с использованием 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 на основе ненасилия ORM должна поддерживать POCO, и любые изменения происходят в самой POCO, основа сохранения должна знать автоматически. Даже если изменить статус объекта с помощью метода (AddRole, RemoveRole), как в приведенном выше примере.

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

Может ли кто-нибудь дать мне некоторые идеи для этого? Благодарю.

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

ответ

1

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

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

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

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

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

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

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

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

Смежные вопросы