Как избежать логики постоянства в доменной модели? - PullRequest
4 голосов
/ 17 октября 2010

Моя модель домена выглядит следующим образом:

class Group
{
    private List<Person> persons;

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

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

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

Ответы [ 2 ]

3 голосов
/ 11 июня 2012

Я понимаю, что это сообщение старое, но оно все еще остается без ответа, поэтому здесь оно идет:

Ключ здесь в том, что ваша модель имеет недостатки, IMO.Группа должна быть объектом домена с простой доступной только для чтения коллекцией «лиц» (членов?).Ответственность за получение и сохранение группы принадлежит 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, Unity и т. Д.) И создайте интерфейс IGroupRepository, который можно внедрить в код приложения для извлечения и сохранения объектов домена группы.

0 голосов
/ 17 октября 2010

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

...