DDD "Просмотр объектов"? - PullRequest
       6

DDD "Просмотр объектов"?

7 голосов
/ 01 декабря 2009

Учитывая приложение, которое включает, скажем, компании, у меня может быть класс компании. У меня будет слой доступа к данным, который заполняет список . Однако в некоторых случаях (например, при отображении результатов поиска) мне нужно отображать только название компании, телефон и почтовый индекс, и мне кажется, что заполнение всего объекта Company всеми его свойствами кажется расточительным.

Что было бы правильным для этого с точки зрения дизайна DDD? Буду ли я создавать View для определенных классов, таких как объект CompanySearchResult, который предоставляет только те свойства, которые мне интересно отображать?

Ответы [ 4 ]

4 голосов
/ 01 декабря 2009

Это то, что обычно называют «моделью представления» или объектом передачи данных. Возможно, вы не хотите, чтобы ваше представление имело доступ ко всему дереву данных, отображаемому моделью вашего домена. Особенно, если представление вашей доменной модели означает, что вашему представлению придется копаться в вашем графе объектов, чтобы получить необходимые данные, модель представления может иметь большой смысл для упрощения работы с объектами модели. В вашем случае, если вы просто извлекаете прямые свойства из объекта модели, имеет смысл, если вы хотите скрыть посторонние данные, которые не нужны остальной части модели вашего домена.

4 голосов
/ 01 декабря 2009

Это звучит как разумный подход ко мне.

Позже, если клиент придет к вам с просьбой, чтобы ваша SearchResult показала что-то, не имеющее отношения к модели Company - что-то сумасшедшее, например, количество магазинов мороженого поблизости, вам будет гораздо легче добавить это к ваш CompanySearchResult чем ваш объект домена.

1 голос
/ 01 декабря 2009

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

list.getCompany(1).getName()

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

0 голосов
/ 01 декабря 2009

Я использую крошку атрибутов сущности. Например:

// interface for "ID" attribute of Company entity
public interface ICompany_ID {
    Guid CompanyID{get;set;}
}
// interface for "Name" attribute of Company entity
public interace ICompany_Name {
    string Name{get;set;}
}
// interface for "Logo" attribute of Company entity
public interface ICompany_Logo {
    byte[] Logo{get;set;}
}

// interface for all attributes of Company entity
public interface ICompany : ICompany_ID, ICompany_Name, ICompany_Logo { }

// base class for classes based on Company entity
public abstract class CompanyBase : ICompany_ID {
    // implementation of ICompany_ID interface
}

// class for all attributes of Company entity
public class Company : ICompany {
    // implementation of ICompany interface (all attributes)
}

// class for Company name lookup
public class CompanyNameLookup : CompanyBase, ICompany_Name {
   // implementation of ICompany_Name interfade
}

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

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

EDIT: Тогда выбор может быть например:

var companies = (from c in db.Table<ICompany>()
                 order by c.Name
                 select new CompanyNameLookup { ID = c.ID, Name = c.Name }
                ).ToList();

или для типов, созданных даным образом:

var companies = (from c in db.Table<ICompany>()
                 order by c.Name
                 select DynamicTypeFactory.New<ICompany_ID>( c.Id ).And<ICompany_Name>( c.Name ).Create()
                ).ToList();

DynamicTypeFactory - это класс со статическим методом New и свободным интерфейсом для классов создания данима во время выполнения.

...