Кажется, что вокруг DDD, репозиториев, средств отображения данных и т. Д. Происходит много "шума", и очень мало кода реализации "реального мира", чтобы показать новичкам, таким как я, что "хорошо", а что "плохо".
Я только что закончил читать книгу Архитектура приложений для предприятия , и это стало большим откровением. В настоящее время я использую шаблон Active Record для проекта на работе и работаю над его изменением для использования модели предметной области. Я использовал множество примеров архитектуры в книге, а также загрузку кода из набора для начинающих Northwind, которая является дополнением к книге.
Все шло отлично, но теперь я столкнулся с моей первой проблемой отображения данных в "реальном мире" ... иначе, вместо того, чтобы мой редактор просто отвечал за то, что взял один объект Entity и сохранил его в базе данных, я теперь иметь объект Entity, имеющий коллекцию IList <>, которую также необходимо отобразить.
Основным объектом Entity является Expert, вот код:
public class Expert
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual IList<Case> Cases { get; protected set; }
}
Вот реализация коллекции из Expert, объекта Case:
public class Case
{
public int ID { get; set; }
public string Name { get; set; }
}
Не может быть намного проще, чем это.
Теперь у меня есть DataMapper для каждого элемента сущности, но мой вопрос заключается в том, что когда я иду сопоставить коллекцию Case в моем коде ExpertDataMapper, что считается «правильным» способом сделать это?
В книге приведен фактический код SQL, который встроен в ExpertDataMapper, который обращается к коду ADO.NET, который принимает все элементы Case в коллекции IList и вызывает этот код один раз для каждого элемента. Вот некоторый псевдокод:
public virtual void Create(Expert expert)
{
// Insert expert in the Expert table
SqlHelper.ExecuteNonQuery(ProviderHelper.ConnectionString, CommandType.Text,
"SQL TO INSERT EXPERT", this.BuildParamsFromEntity(expert));
// Insert individual Case items in the Case table
foreach (Case c in expert.Cases)
{
SqlHelper.ExecuteNonQuery(ProviderHelper.ConnectionString, CommandType.Text,
"SQL TO INSERT CASE", this.BuildParamsFromEntity(order));
}
}
Итак, две вещи не так сразу бросаются в меня:
- Почему ExpertDataMapper имеет вызов SQL (или хранимый вызов proc) для вставки встроенного в себя Case? Для меня это нарушает идею инкапсуляции ... ExpertDataMapper не должен ничего знать о том, как Case вставляется в базу данных, то есть работа CaseDataMapper.
Я бы предположил, что ExpertDatMapper ДОЛЖЕН ДЕЛЕГИРОВАТЬ задачу вставки Case в CaseDataMapper ... но я не знаю, является ли это "правильным" или "неправильным" для одного DataMapper для создания экземпляра другого. Это считается обычной проблемой с DataMappers? Я не могу найти никаких указаний по этой проблеме, которые, как я полагаю, довольно распространены.
- Если у меня есть 100 дел, связанных с этим экспертом, это 100 созданных объектов дел и 100 операторов вставки для базы данных? Что-то в этом мне кажется «неправильным» и противоречит моему лучшему суждению. Теперь, если бы мне посчастливилось использовать SQL Server 2008, я мог бы использовать Table Valued Parameters, и это было бы не так плохо, но сейчас у нас 2005 год.
Итак, когда дело доходит до DataMappers, я не видел никаких конкретных реализаций простого создания, обновления и т. Д. В DataMaper объекта сущности с простой ассоциацией коллекции. В книге, которую я читаю, нет кода для ее поддержки (и код, который там находится, кажется мне подозрительным).
Я прочитал и владею книгой Мартина Фаулера о EAA, поэтому, пожалуйста, не говорите мне искать там. Я также знаю о доступных мне инструментах ORM, поэтому мне не нужно заботиться о реализации DAL самостоятельно. Я играл с EF 4.0, и мне это нравится. Но для этого проекта у меня нет возможности использовать инструмент ORM.
Большинство книг / примеров, кажется, останавливаются на одной и той же базовой предпосылке, что, пока у меня есть однозначная связь между моим объектом Entity и таблицей, к которой он сохраняется с помощью DataMapper, мир просто окрашен в розовый цвет используя подход Доменная модель ...
Если бы все мои сущности были один-на-один, я мог бы просто использовать Active Record и покончить с этим.
Любое руководство, предложения, понимание? Извините, это длинный пост, но я читал другие посты с похожими проблемами, и никаких конкретных ответов или предложений о том, как решить проблему, представленных здесь, нет.