Спасибо, Ладислав, за ваш ответ, поскольку вы подтвердили то, что уже было в моей голове.
В итоге я немного изменил свой подход. Я понял, что мое использование бизнес-объекта само по себе было излишним и ненужным. Или, может быть, просто неправильно. Оценивая свои требования, я понял, что могу «упростить» свой подход и заставить все работать. Взяв каждый логический слой в моем приложении и посмотрев, какие данные необходимо передать между слоями, я нашел проект, который работает.
Во-первых, для моего уровня бизнес-логики вместо бизнес-объекта я реализовал объект Unit of Work: SomethingManager . SomethingManager привязан к моему корневому объекту Something , поэтому любое действие, которое я хочу выполнить с Something , выполняется с помощью SomethingManager . Это включает в себя такие методы, как GetById, GetAll, Save и Delete.
Класс SomethingManager принимает в своем конструкторе два объекта: IValidator и ISomethingRepository . Они будут введены контейнером IoC. Первый позволяет мне выполнить всю необходимую проверку с использованием любой выбранной нами среды (первоначально блока приложений проверки), а второй дает мне невежество в отношении стойкости и абстрагирует от использования Linq-to-SQL сегодня, а также значительно упрощает обновление до EF4 в дальнейшем.
Для моего уровня обслуживания я подключил контейнер IoC (в данном случае Unity) к WCF, чтобы экземпляр службы создавался контейнером. Это позволяет мне внедрить экземпляр ISomethingManager в мой сервис. Используя интерфейс, я могу сломать зависимость и легко провести модульное тестирование класса обслуживания. Кроме того, поскольку контейнер внедряет экземпляр ISomethingManager , он создает его и автоматически разрешает его зависимости.
Затем я создал DataContracts, чтобы представить, как должны выглядеть данные при передаче по сети через сервис. Каждый объект Запрос / Ответ содержит эти DataContracts как DataMembers вместо прямой ссылки на мои классы сущностей (или BO). Это сервисный метод для отображения данных, поступающих или идущих на уровень бизнес-логики (через ISomethingManager ) - с помощью AutoMapper, чтобы сделать это чистым и эффективным.
Вернувшись на уровень данных, я просто расширил сгенерированные классы сущностей, определив частичный класс, который реализует требуемый интерфейс из BLL. Например, сущность Something L2S имеет частичное определение, которое реализует ISomething . И ISomething - это то, что SomethingManager (и ISomethingManager интерфейс) и ISomethingRepository работают с тем, чтобы упростить запрос к базе данных и передать Сущность L2S вверх по цепочке для уровня обслуживания, чтобы потреблять и передавать (без уровня обслуживания, имеющего какие-либо знания или зависимость от реализации L2S).
Я ценю любые комментарии, вопросы, критику или предложения, которые есть у кого-либо об этом подходе.