Back in March I did the blog entry The value of N-Tier Design, I didn’t provide any code, it was just a simple here is why N-Tier is good. After some reflection I have decided to revisit the subject and go a little more into detail.
The primary focuses of N-Tier is to provide a separation of concerns that will make your code more testable and more importantly maintainable, remember the code you write today, is the code you maintain tomorrow. Most of what I’m going to cover are some simple suggestions to make your life easier by putting in a little extra work up front, they may not be applicable in all situations, like a small one time use app for parsing a log file, some good rules of thumb are, if you can rewrite the application in less then 4 hours or it’s a proof of concept for a specific technology, it’s a little over kill for that.
The basic layers of N-Tier are
- UI Layer – Contains the logic for interacting with your user, this could be a web form, web service, command-line application, Winform, etc.
- Biz Layer – Contains business logic like data validation, manipulation, etc. Basically any logic that deals with business rules belongs in the Biz
- Data Access Layer – Getting the Data and mapping it to Entities. this could be from a Data Base, a 3rd party web service, an xml File, etc.
- Data Entities – Are not a layer, but how data is passed from one layer to another
Layer can consist of a single class or a set of classes that perform different tasks as long as they are doing what that layer is tasked with.
The basic rules for N-Tier are simple
- Layers can only talk to the layer right next to it, the UI layer can only talk to the Biz layer, the Biz can talk to the UI layer and the Data Access but the Data Access layer can only talk to the Biz Layer
- A Layer should have no internal knowledge of any of the other layers, A Biz class should have no understanding of how the DAL gets the data that it gives the it, The data could come from a Database, an XML File, or be randomly generated. Getting the data isn’t the Biz layers job so it shouldn’t care where it comes from, this becomes more important when you start using dependency injection and the underlying code may change completely.
- The layers should be decoupled and use interfaces to communicate with each other, this makes it easier to swap out code, use dependency injection , etc. you should be able to completely change a layer and as long as it keeps the same interface.