AOP with PostSharp
Download
Report
Transcript AOP with PostSharp
NCSoft China PD Dept. training - Session 4
-- Lance Zhang
http://blodfox777.cnblogs.com
Topics
What is AOP
Existing AOP Frameworks in .NET
Introduce PostSharp
How does PostSharp work
How to use PostSharp
Q&A
Suppose We have a System…
It Grows…
Code Smells similar…
Now We've Got A Problem(Ctrl + C/V)…
So We Concerns…
Application Concerns
Functional Requirements
Line-of-business.
Non-Functional Concerns
Logging
Caching
Transaction
Security
Validation
Persistence
…
Aspects - Reduce noise in source
Move plumbing out of source, but keep behaviour
the same
AOP …
doesn’t solve any new problems.
is just too complex.
adoption is all or nothing.
Promotes sloppy design.
Aspects …
obscure program flow.
can’t be unit tested.
Debugging with Aspects is hard.
Aspects Lingo
Advice
The duplicated plumbing code we are removing
Typically under 30 lines of code
Behaviour that is injected at a join point
Join points
Places within the code where the Aspect is inserted
Examples
Entry/Exit of a method or property
Class’s Type Definition
Aspects Lingo
Point cut
Locates Join Points to apply advice
Filter driven – Automatic injection
Find all Methods, of type Setter, in all classes where
Namespace equals “Application.Entities”
Attribute driven – Manual injection
Aspects Lingo
Weaving
Process of injecting functionality back into a
component
Can be performed by
Text post processor – Magic comments can replaced by
code
Proxy container – Uses decorator pattern/hooks to allow
code to be inserted
Binary manipulation - Modifying assemblies - by
replacing and injecting IL code
Existing AOP Frameworks in .NET
AOP with Castle Windsor Dynamic Proxy
Dynamic Proxy does the heavy-lifting of the IL
generation for us
Much easier for most requirements
AOP with Spring.NET
Can use something other than attributes such as XML
configuration.
Sorry, but actually I am
unfamiliar with them…
AOP with PostSharp
Compile-time MSIL Injection - by MSBuild Task
Easy to use - like normal Attribute
Intercept any method - not only Virtual
More Join points - on: field access, exception
More controllability - break, change param or return
More transparent - no need “new proxy()”
Multicasting Custom Attributes - filter
Code quality after injection
Complexity of Debug
That's Great, But I Need Some Code.
Originally
we writeby
plumbing
inline.
Then we refector
PostSharp
.
Okay, Where Is The Plumbing Code?
Attribute
Exception
handling
Attributefor
for
CachingSharp
.
How Do We Go From Attributes To Aspects?
We can look at an assembly compiled with PostSharp attributes enabled
and disabled to see what happened.
Assembly Before/After Injection
Before
Injection
Atfer Injection
How Can I Implement PostSharp?
PostSharp.Laos.dll
Handles most every type of AOP use, it’s the root
namespace for all the demo code we’ll look at.
Can use commercially, custom non-viral licensing.
Implemented as a plugin built on the PostSharp.Core
framework.
PostSharp.Public.dll
Support library for PostSharp.
PostSharp.AspNet.dll
Only if you are in an ASP.NET project.
When Can PostSharp Insert Code?
PostSharp.Laos.OnMethodBoundaryAspect
OnEntry
OnExit
OnSuccess
OnException
PostSharp.Laos.OnMethodInvocationAspect
OnInvocation
PostSharp.Laos.OnExceptionAspect
OnException
PostSharp.Laos.OnFieldAccessAspect
OnGetValue
OnSetValue
Other Aspects
PostSharp.Laos.ImplementMethodAspect
Replace a method’s content with the advice in the aspect
Useful for modifying 3rd party components
PostSharp.Laos.CompositionAspect
Allows an interface/state to be injected into a
component
Used to simulate multiple inheritance
Examples include
Adding .NET Win Form data binding to a POCO
Adding Entity Framework interfaces to a POCO
References
PostSharp - David Ross
Introduction to AOP with PostSharp - Michael D. Hall
What Is PostSharp? - http://www.postsharp.org
Using AOP and PostSharp to Enhance Your Code: Part
A - Doron's .NET Space
PostSharp - Lightweight Aspect-Oriented System http://www.rainsts.net/
Learn more...
http://www.postsharp.org/
http://davybrion.com/blog/category/postsharp/
http://www.codeplex.com/ValidationAspects
http://www.eclipse.org/aspectj/doc/released/progguid
e/