Я принимал BO и отправлял обратно BO из DAL через модель моста и модель провайдера. Я не вижу смысла в DTO, если не боюсь тяжелой сериализации (скажем, веб-службы или JSON). Мой подход состоял в том, чтобы абстрагироваться от уровня данных и бизнес-уровня через интерфейс и предоставлять анонимный уровень данных, передаваемый в бизнес-объект. Это означает, что я могу подключить любой уровень данных, реализовать интерфейс, который имеет универсальные методы Load и Save и который затем доступен через уровень моего домена. В BL нет кода DAL - просто вызов предоставленного и абстрагированного уровня данных. Мой вызов уровня данных управляется шаблоном провайдера (без прямой ссылки), и я просто делаю:
public class Person : IBusinessObject<Person>
{
protected IDataLayer<T> dataLayer;
Person Load() { this.dataLayer.Load(this); }
}
в слое данных у меня есть ...
public class PersonMapper : IDataLayer<Person>
{
Person Load(Person person) {
...get DB stuff...map to person...decorate object...
return person;
}
}
Я до сих пор не знаю, хорошо ли это, но у меня это работает довольно хорошо. Мне удалось получить ленивую загрузку для вложенных объектов, используя отражение.