Если я правильно понял вопрос, вы создали модель домена, и вы хотели бы написать объектно-реляционный картограф для сопоставления между записями в вашей базе данных и объектами домена. Тем не менее, вы обеспокоены загрязнением вашей модели домена кодом «сантехника», который необходим для чтения и записи в поля вашего объекта.
Если вы сделаете шаг назад, у вас есть, по сути, два варианта, где разместить код отображения данных - внутри самого класса домена или во внешнем классе сопоставления. Первый вариант часто называют шаблоном Active Record и имеет то преимущество, что каждый объект знает, как упорствовать и имеет достаточный доступ к своей внутренней структуре, чтобы позволить ему выполнять сопоставление, не открывая поля, не связанные с бизнесом.
например
public class User
{
private string name;
private AccountStatus status;
private User()
{
}
public string Name
{
get { return name; }
set { name = value; }
}
public AccountStatus Status
{
get { return status; }
}
public void Activate()
{
status = AccountStatus.Active;
}
public void Suspend()
{
status = AccountStatus.Suspended;
}
public static User GetById(int id)
{
User fetchedUser = new User();
// Lots of database and error-checking code
// omitted for clarity
// ...
fetchedUser.name = (string) reader["Name"];
fetchedUser.status = (int)reader["statusCode"] == 0 ? AccountStatus.Suspended : AccountStatus.Active;
return fetchedUser;
}
public static void Save(User user)
{
// Code to save User's internal structure to database
// ...
}
}
В этом примере мы имеем объект, представляющий пользователя с именем и AccountStatus. Мы не хотим, чтобы статус был задан напрямую, возможно, потому, что мы хотим проверить, является ли изменение действительным переходом статуса, поэтому у нас нет сеттера. К счастью, код сопоставления в методах GetById и Save static имеет полный доступ к имени и статусу объекта.
Второй вариант - иметь второй класс, который отвечает за отображение. Это имеет то преимущество, что разделяет различные проблемы бизнес-логики и настойчивости, которые могут позволить вашему дизайну быть более проверяемым и гибким. Проблема с этим методом заключается в том, как открыть поля имени и статуса внешнему классу. Некоторые варианты: 1. Используйте рефлексию (которая не имеет никаких сомнений в том, чтобы копать глубоко в частных частях вашего объекта) 2. Предоставляйте специально названные публичные сеттеры (например, прикрепите их к слову «Частный») и надейтесь, что никто их не использует случайно 3. Если ваш язык поддерживает его, сделайте сеттеры внутренними, но предоставите доступ к модулю модуля данных. Например. используйте InternalsVisibleToAttribute в .NET 2.0 и далее или друг функции в C++
Для получения дополнительной информации, я рекомендовал бы классическую книгу Мартина Фаулера «Узоры архитектуры предприятия»
Однако, как слово предупреждения, прежде чем идти по пути написания собственных которые я настоятельно рекомендовал бы использовать сторонний инструмент реляционного картографирования объекта (ORM), такой как nHibernate или Microsoft Entity Framework. Я работал над четырьмя различными проектами, где по разным причинам мы написали собственный картограф, и очень легко тратить много времени на сохранение и расширение карты, вместо того, чтобы писать код, который обеспечивает конечное значение пользователя. Я использовал nHibernate в одном проекте до сих пор, и хотя изначально он имеет довольно крутую кривую обучения, инвестиции, которые вы вкладываете в начале, значительно окупаются.
Я полагаю, это может сработать, если все, что вы делаете, - это положить экран поверх таблицы базы данных. – 2008-10-01 20:45:50