In order to achieve a loosely coupled application, I created a business layer and domain entities on which both the presentation and data access layer projects depend on.
The presentation layer uses domain entities and calls the business layer methods and the data access layer uses domain entity classes to return data to its caller resulting in a classic 3-tier application.
Bomboca.Marketing.Web Bomboca.Marketing.Business.Domain Bomboca.Marketing.Business.Abstractions Bomboca.Marketing.DataAccess.Abstractions
Having the business layer, as thin as it may be, in the middle of the other two layers allows us to change (or add) any layer e.g. use the same business logic to load a mobile application or an API for 3rd parties. In practice, changing the main data source to another CMS and keeping the umbraco presentation layer would make less sense (but it would still be viable to use additional data sources).
At this point, the business and data access layers are abstractions only. For each of these, I created two other projects with the respective implementations.
Check the next post to see how all this is tied together using dependency injection.