Created Category business object.
Renamed all ComplexCommerce.Csla classes to be prefixed with Csla so they don't collide with normal Csla classes.
Added CategoryProductList (Products) to Category.
Reworked SingletonObjectCache so it is thread safe.
Renamed Contains() and Remove() functions to HasValue() and Clear() to clarify intent on SingletonObjectCache.
Added ProductRoute and reworked caching so the key is passed through the interface.
Added generic overload to IDependencyInjectionContainer.Resolve() to eliminate unnecessary casting.
Added a user-friendly 301 redirect page that will display for any browsers that don't follow the 301.
Refactored routing redirect into base class RedirectRouteBase. Created LowerCaseRedirectRoute and TrailingSlashRedirectRoute for SEO.
Added Csla business rules to handle formatting the RouteUrl properly that is retrieved from the database so it can be matched exactly to HttpContext.Request.Path.
Added Csla rule to build path for the product. Added VirtualPath property to RouteUrlPageInfo and RouteUrlProductInfo that returns the path without the leading or trailing slashes. Made ProductRoute conditional based on tenant type.