Вы должны написать как можно меньше классов, соответствующих вашим требованиям. Таким образом, вы с меньшей вероятностью будете повторяться, меньше будет проверять, и будет меньше вещей, которые могут пойти не так, когда вам нужно изменить код.
Если ваш клиентский код действительно должен выполнять логику домена , вам следует либо:
1) Десериализация напрямую в классы модели предметной области (особенно если вы используете ORM, поддерживающий постоянное невежество).
// Customer is a business object / aggregate root with domain logic
ICustomer customer = customerRepository.Get<Customer>(customerId);
2) Используйте объекты передачи данных для инициализации классов модели вашего домена:
// Given a customer data transfer object
ICustomer customer = new Customer(customerDto);
Я бы предпочел не писать DTO, если мне не нужно, поэтому я предпочитаю первый подход. Но иногда DTO необходимы, например, когда вы используете автоматически сгенерированные классы, создаваемые прокси-серверами служб, или если вы предоставляете свои собственные DTO-службы.
Если клиент не должен выполнять бизнес-логику , ему никогда не нужно знать о классах модели вашего домена. В этих случаях клиент должен использовать объекты передачи данных или классы модели пользовательского представления.