Tuesday, August 25, 2009

N-Tier Design Revisit part 5 – UI Layer

Finally we come to the User Interface Layer, logically this can be the simplest part of your application with something like a web service that simply exposes a set of APIs calls to your business layer or by far the most complex part of your application with something like a multi-threaded winform.

The most important thing to remember is just like every other layer, the UI layer ONLY contains UI logic:

  1. Navigation: One of the most important and visible parts of your application, it doesn't matter how good your content is, if you can’t navigate through it. The basic rules are: Keep it simple, Intuitive, and Consistent if your customers have to think about how to navigate, there is a problem.

  2. Event Handling: The basic process of taking input from the customer and responding to it appropriately.

  3. Application State: Keeping track of where the user is and what they are doing can be very complex or fairly simple depending on the type application your working on.

  4. Displaying: This is basically everything the the user sees from controls to the application output and has the same basic rules as Navigation for the same reasons, if your application is hard to use, your users wont use it.

The most important thing to remember is to keep any logic that isn’t specific to the UI out of the UI, a good example is validation. If you put your validation in the UI you then have to maintain your validation logic in multiple places(asp.net application, WinForm, Web service, etc). and can lead to inconsistent validation between your applications, Save yourself the pain and put a validation in the biz layer. There are some small exceptions for web development when using client side validation, just remember to NEVER trust input from the client, this goes double for web clients, to quote Tony Rose “The Client is in the hands of The Enemy.” and should never be trusted, it’s too easy to have javascript errors that circumvent your validation.

Technorati Tags: ,,,

Sunday, July 26, 2009

N-Tier Design Revisit part 4 – Biz Layer

The Biz Layer Only handles Business logic, nothing more, noting less. It doesn't know or care where the data came from or where it's going, it only cares about manipulating the data to comply with business rules, this would include date validation, data filtering, and data processing.

  1. Validation: This can include checking to see if the data in an entity conforms to business rules, if the request from the UI is valid

       1: public bool AuthenticateUser(string user, string pass)
       2: {
       3:     bool success = false;
       4:     if (user.Trim().Length>0 && pass.Trim().Length>0)
       5:     {
       6:         success = AuthenticationRequestInterface.AuthenticateUser(user, pass);                
       7:     }
       8:     return success;
       9: }    

    in this case the username and password must both have something other then spaces. This could also include a validation api to handle validation requests from the UI, this way you can have consistent validation for every type app that might use it(win forum, win service, website, etc.) .

  2. Data Filtering: For the most part this is telling the DAL what data it needs, let the DAL figure out how to get it, an example of this would be if you have a collection of accounts and an account must have specific privileges to have access to some data then only request the data for the accounts in the collection that have these privileges

  3. Data processing: Basically any processing that is based on business rules. This can be as simple as requesting more data based on business rules to parsing text, like a log file, to get specific data, etc. One major advantage of doing N-Tier is if you have an application that is very process intensive it’s easy to scale out using something like wcf or old school web services and move all or part of your business layer to a farm and scale as much as you need from there. NTierLayout

This way you don’t need a bunch of beefy boxes for web servers, this is also nice if your setting this up as a client server app. If done right, you can use the adaptor pattern to spread your application to completely different servers. The point is to isolate functionality in your application, this makes it easy to test, maintain, and update.

Wednesday, July 22, 2009

N-Tier Design Revisit part 3 – Data Access Layer

The Data Access Layer abstracts your data requests away from the rest of your application and prevents your Biz Layer from needing to know where your data comes from.

In it’s simplest form a DAL is a class that pulls data from a data source(SqlServer, MySql, an XML File, a web service, the Cloud, etc.) populates a data entity and returns it to the Biz layer for some the DAL is simply a Object Relational Mapper like NHibernate or The Entity Framework, while this is fine, I would recommend against it for the simple reason that I want the Biz to know as little about where the data comes from as possible and if it’s talking directly to Entity Framework then it has more knowledge about how the system is setup then it should; and what happens if you have to change ORM Tools?  I think ORM tools are for the most part great, but I strongly feel you should abstract them away preferably using an interface this makes it much easier to swap of the underlying code if you have to, plus it makes it much easy to test. 

One type of ORM I would suggest you avoid are the code gen ORMs like subsonic, it’s quick and easy to pull your data entities, but your now very strongly tied to your database schema and database changes affect your entire application, also what if not all of your requests are to a database, at work we have several products that use 3rd party web services that tie into data from the database and are returned to the Biz Layer, that’s hard to do if your entities are being build for you by a code generator.   

Finally there are only 2 really solid rules for the DAL

1: Expose as little about your data sources as possible, this prevents them from being too tightly coupled to your data source.  Recently we switched data vendors for one of our products, as far as the rest of the application knew nothing had changed even though the underlying web service was completely different.

2: The only logic in the DAL is to filter data and map it to data entities, at this point all of your validation should be done (that’s the Biz layers job).

Technorati Tags: ,

Sunday, July 19, 2009

N-Tier Design Revisit part 2 – Data Entities

Entities are unique in N-Tier, they are the only thing that is used by every level. In my original N-Tier entry I stated that it’s was ok to put your entities in your Data Access Layer (DAL), this is a very common practice with a lot of Object Relational Mappers (ORMs), some will even generate your entities from your data base (subsonic, Entity framework, etc.). The reason I dislike this is you are making your DAL a dependency in every layer of your application, further more if your using something like subsonic to generate your data entities you are tightly coupling your database design to everything. I would strongly encourage you to place your data entities into a separate project, the main focuses here is to decouple your application, the less any one part of your app knows about any other part the better.

It is my firm belief that Data Entities should contain data and have very little too no logic, and what logic they do have should only relate to manipulating themselves they are dumb objects, THEY DO NOT CONTAIN BUSINESS LOGIC!, DATA ACCESS LOCIC, OR UI LOGIC. if they do you have a layer violation. The only function of a data entity is to hold data and be passed from one layer to the next nothing more! Here is a code sample for a data entity

   1: public class Customer
   2:     {
   3:         public int Id { get; set; }
   4:         public string FirstName{get; set;}
   5:         public string LastName { get; set; }
   6:         public string Company { get; set; }
   7:         public string Email { get; set; }
   8:         public string Phone { get; set; }
   9:     }

It’s really nothing more then a data structure, but what data you put into your entities is also important, if you have a property called company logo, that has a value like “/images/logos/customer12.png” you have a problem, now every layer has information about your UI, a better solution is to only store the “customer12.png” value and let the UI figure out how to display it.

For entities I usually create a collection object named the plural of the class it holds. The code looks something like this.


   1: public class Customers :Collection<Customer> {}
I personally like using generic collections as a base class, it makes a strongly typed, fast, and with only one line of code easy, collection object. I have everything I need baked in, with the possible exception of the ability to add collections, but with a little refactoring this is added

   1: public class Customers :Collection<Customer>
   2: {
   3:     public void Add(IEnumerable<Customer> newCustomers)
   4:     {
   5:         foreach (Customer customer in newCustomers)
   6:         {
   7:             Add(customer);
   8:         }
   9:     }
  10: }

if you noticed I use generic IEnumerable<Customer> this way I can add any collection that implements IEnumerable, this could include: another Customers object, a List<Customer> , etc. As with the single entity the collection should have limited logic and what logic it has should only deal with managing the items it holds.


Technorati Tags: ,,

Friday, July 17, 2009

N-Tier Design Revisit part 1 – Over View

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

  1. UI Layer – Contains the logic for interacting with your user, this could be a web form, web service, command-line application, Winform, etc.
  2. Biz Layer – Contains business logic like data validation, manipulation, etc.  Basically any logic that deals with business rules belongs in the Biz
  3. 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.
  4. 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

  1. 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
  2. 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.
  3. 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.