2010-10-17 3 views
4

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

class Group 
{ 
    private List<Person> persons; 

    public void AddPerson(Person p) { 
     persons.Add(p); 
     DoSideEffect() 
    } 

    public List<Person> GetPersons() {...} 
} 

Теперь мне нужно упорствовать его. По DDD я не могу добавить никаких атрибутов персистентности к этому классу, поэтому сериализаторы XML не будут работать. BinaryFormatter не может использоваться, поскольку формат должен быть доступен для чтения. Я могу вручную вызвать GetPersons() и сохранить их, но как я их загружу? Если я вызываю AddPerson(), тогда возникает побочный эффект. Побочный эффект должен произойти только тогда, когда человек «действительно» добавлен в домен, а не с постоянством.

ответ

3

Я понимаю, что этот пост старый, но он по-прежнему остается без ответа, так что здесь идет:

Ключевым моментом здесь является то, что ваша модель является некорректной, имо.

Группа должна быть объектом домена с простой коллекцией «лиц» только для чтения (участники?). Ответственность за извлечение и сохранение группы принадлежит к GroupRepository, который загружает данные из хранилища сохраняемости и восстанавливает объект.

Например:

public class Group 
{ 
    private Collection<Person> _persons; 

    public Group(Collection<Person> persons) 
    { 
     if (persons == null) 
      throw new ArgumentNullException("persons"); 

     _persons = persons;  
    } 

    public IEnumerable<Person> Persons 
    { 
     get { return _persons; } 
    } 

    public void AddPerson(Person p) 
    { 
     if (p == null) 
      throw new ArgumentNullException("p"); 

     _persons.Add(p); 
     DoSideAffect(); 
    } 
} 

public class GroupRepository 
{ 
    public Group FindBy(Criteria c) 
    { 
     // Use whatever technology (EF, NHibernate, ADO.NET, etc) to retrieve the data 

     var group = new Group(new Collection<Person>(listOfPersonsFromDataStore)); 

     return group; 
    } 

    public void Save(Group g) 
    { 
     // Use whatever technology to save the group 
     // Iterate through g.Persons to persist membership information if needed 
    } 
} 

Используйте рамки инъекции зависимостей (Spring.NET, MEF, единства и т.д.) и создать интерфейс IGroupRepository, который может быть введен в коде приложения для извлечения и сохраняются вашу группу доменных объектов.

0

Отсутствие атрибутов - это не шоу-стоппер; XmlSerializer имеет конструктор, который будет проходить в этой модели во время выполнения (но, честно говоря, в большинстве случаев значения по умолчанию прекрасны), как и несколько других сериализаторов. XML через XmlSerializer, очевидно, желательно, если читаемость является проблемой. См. XmlAttributeOverrides. Я также могу предложить некоторые бинарные сериализаторы, которые будут работать здесь.

+0

Как XmlSerializer может работать с закрытыми полями? –

+0

@Yaron; ах, нет, не может. DataConractSerializer * может * хотя. Как может protobuf-net «v2», если вы не возражаете против двоичного кода. Я знаю, что последний поддерживает модели без атрибутов («Потому что я написал это»). –

+0

@Yaron - другой подход - это выделенный слой DTO. –

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