Идут ли специфичные для базы данных типы в доменной модели или на уровне доступа к данным? - PullRequest
3 голосов
/ 26 октября 2011

У меня есть мои сущности, такие как Заказчик, Заказ и т. Д., Определенные в моей доменной модели.

Теперь я хочу определить интерфейс под названием IRepository для представления моего уровня персистентности, далее у меня будет SQLRepository, CacheRepository, который реализуетIRepository.

Теперь мне интересно, стоит ли мне определять IRepository в доменной модели или на уровне доступа к данным?Я предполагаю, что SQLRepository и CacheRepository должны входить в DAL, но IRepository также входит туда?

Далее, например, мой репозиторий возвращает список клиентов из таблицы Customer, я немного запутался в том, какчтобы спроектировать это, кажется, что я заканчиваю тем, что повторяю типы в DAL и Domain Model.Смотрите пример ниже:

В приложении я хочу сделать что-то вроде этого:

var repository = new SQLRepository();

//Below repository.customers represents customer table
List<Customer> customers = repository.Customers.list();

Итак, в моем домене:

class Customer
{
  public int id;
  public string name;
}

В моем DAL:

class SqlRepository:IRepository
{
   public CustomerTable Customers;
}

class CustomerTable 
{
   public List<Customer> list();
}

Я хотел бы знать, есть ли лучший способ дизайна этих слоев?

* ОБНОВЛЕНИЕ

У меня уже есть DAL и домен, определенные в разных библиотеках / сборках классов.Первоначально я думал, что у меня будут объекты POCO, такие как Customer, которые представляют одну запись в таблице базы данных, но тогда где объявить Customer.Add (customer)?это идет в DAL?Мне не нужны бизнес-правила в DAL, если я начну добавлять методы в свои сущности, они станут сложными, и в них будет присутствовать логика персистентности и бизнес-логика.

Ответы [ 2 ]

0 голосов
/ 26 октября 2011

Следующая информация относится к другой проблеме, она показывает простую структуру проекта: Размещение модели в отдельной сборке

Мое мнение таково, что интерфейс IRepository должен быть открытым в вашем проекте DataLayer.Реализации могут быть частными (использовать Factory или Dependency Injection для загрузки их в другие проекты), а создаваемая вами модель предметной области может использоваться совместно вашим бизнес-уровнем и уровнем данных.

0 голосов
/ 26 октября 2011

Один из вариантов - поместить ваши типы в отдельную общую сборку или сборку типов, на которую ссылается бизнес-уровень и уровень данных.Будьте осторожны, чтобы ограничить то, что входит в эту сборку, чтобы не вводить ненужную связь.

Это аналогичный подход к размещению констант в общей сборке, совместно используемой уровнем SQL (предварительно обработанным), уровнем бизнес-логики иобъектная модель ...

...