Здесь слишком много вопросов, чтобы определить лучший путь.
Если эти приложения могут повторно использовать дополнительные функциональные возможности, предоставляемые классами в вашем DAL, то я бы сказал, что они абсолютно повторно используются.
Например, «Продукт». Если DAL имеет определение продукта, которое очень близко или совпадает с определением, которое требуется приложениям, тогда повторное использование - ваш лучший выбор.
Если приложения явно НЕ хотят функциональности, предоставляемой классами, а вместо этого хотят предоставить свою собственную реализацию, то просто используйте интерфейсы.
Опять же, смотрите на «Продукт»: если приложения имеют свое собственное определение Продукта с возможно дополнительными или просто другими свойствами и методами, то они должны реализовать интерфейс.
Это действительно вопрос о том, как будут использоваться эти классы.