Сначала подумайте о приложении в 3 слоя. Во-первых, это слой данных или персистентности, это может быть база данных, XML-файлы или любые другие данные ввода / вывода. Второй - это домен или бизнес-уровень, где применяются фактическая логика и бизнес-операции. Наконец, слой представления, это может быть приложение для Windows, веб-сайт и т. Д.
Сначала решите, хотите ли вы использовать ориентированный на данные подход или подход, ориентированный на домен. Подход, ориентированный на данные, - это когда классы вашего доменного уровня точно соответствуют вашей структуре данных, что упрощает сохранение, а уровень представления - более сложный. Подход, ориентированный на домен, - это когда классы вашего доменного уровня отражают больше логических сущностей проблемы, часто делая представление более простым, но сложным для сохранения данных.
Старайтесь, чтобы каждый слой был максимально отделен от остальных. Используйте слабосвязанные интерфейсы, где требуется связь между ними. Например, уровень домена может определять набор интерфейсов (или контрактов), точно определяющих, что ему нужно / что нужно получить от уровня домена (например, используя комбинацию шаблона хранилища и шаблона DTO). Точно так же уровень представления должен определять контракт именно для того, что ему нужно / что он ожидает получить от уровня домена, хорошим примером этого является VM-часть шаблона MVVM.
Уровень домена часто выступает в качестве посредника между уровнями данных и представления, сопоставляя уникальный способ представления бизнес-данных каждым уровнем. Ни на каком этапе уровень представления не должен знать об уровне данных или наоборот.