Когда дело доходит до слоев и уровней, будьте проще. Некоторые разработчики становятся очень академичными, когда дело доходит до бизнес-уровней, но все, что они делают, это добавляют ненужную сложность (будьте осторожны архитектура астронавтов ). Поэтому мой первый совет - сделать его простым и легким в обслуживании для вашего конкретного приложения.
Цель состоит в достижении баланса между сложностью обслуживания и гибкостью. Вы хотите, чтобы ваше приложение имело гибкость, не требуя большого количества изменений, но в то же время вы хотите иметь приложение, которое легко понять.
Хорошо иметь хотя бы один слой между вашей настойчивостью и клиентом. Это дает вам гибкость в размещении домена и / или службы между клиентом и базой данных. Я бы не пошел дальше этого, если бы вы не решили конкретную проблему.
Что касается загрузки из вашей персистентности, вы можете использовать частичные классы для расширения сгенерированных классов персистентности. Это простой способ добавить дополнительную функциональность, сохраняя оригинальные свойства и методы в такте.
Если вам нужно преобразовать объекты персистентности в объекты домена, используемые приложением, я бы порекомендовал поместить конструктор или статический метод Create для объектов домена, которые принимают объект персистентности, а затем преобразуют его в объект домена. Вы можете сделать то же самое, возвращаясь к постоянству.
using MyApp.Domain;
public class Customer
{
public string Name { get; set; }
public string Address { get; set; }
public int ID { get; set; }
public static MyApp.Domain.Customer Create( MyApp.Persistence.Customer pcustomer )
{
return new MyApp.Domain.Customer
{
Name = pcustomer.Name,
Address = pcustomer.Address,
ID = pcustomer.ID
}
}
public void Persist( MyApp.Persistence.Customer pcustomer )
{
pcustomer.ID = this.ID;
pcustomer.Name = this.Name;
pcustomer.Address = this.Address;
}
}
Вот как может выглядеть частичный класс. Ключ в том, чтобы пространство имен класса совпадало с пространством имен вашего сгенерированного типа персистентности.
using MyApp.Persistence;
public partial class Customer
{
public string FormatedAddress
{
// I now have access to all the generated members because
// I'm extending the definition of the generated class
get
{
return string.Format( "{0}\n{1},{2} {3}",
StreetAddress,
City,
State,
ZipCode );
}
}
}