We've learned some valuable information. We started off by looking at the decorator pattern and then the proxy pattern. The proxy pattern provides objects that act as substitutes for real service objects used by clients. A proxy receives a client request, performs the necessary work, and then passes the request to the service object. Since proxies share the same interfaces as the services they substitute, they are interchangeable.
After covering the proxy pattern, we then moved onto AOP with PostSharp. We saw how we can use aspects and attributes together to decorate code so that at compile-time, it injects code to perform the required operations, such as exception handling, logging, auditing, and security. We extended the aspect framework by developing our own aspect and looked at how to use PostSharp and the decorator pattern to address the cross-cutting concerns of configuration management, logging, auditing, security, validation, exception handling, instrumentation...