postsharp
xCutting – AOP bei der .NET User Group Niederrhein – Video, Slides & Download
On 12, Apr 2012 | inAOP, Clean Code Developer | vonJohannes Hoppe
Johannes Hoppe spricht von seiner Sicht über Clean-Code und die Grenzen von objektorientierter Programmierung bei der .NET User Group Niederrhein. Anhand praktischer Bespiele zeigt er, wie man mit dem AOP-Framework Postsharp elegante Modularisierungsansätze erhält. Der Vortrag richtet sich an interessierte Einsteiger in das Thema Aspektorientierte Programmierung (AOP) mit .NET.
Alle relevanten Code-Fragmente sind weiter unten aufgelistet!
Hier sind alle Code-Fragmente aus dem Video:
[HandleError(ExceptionType = typeof(MyException))] [AcceptVerbs(HttpVerbs.Post)] [MyConvertExeption] public ActionResult Edit(Note noteToEdit, int[] newCategories) { NoteWithCategories changedNote = this.WebNoteService.Update(noteToEdit, newCategories); return View(changedNote); }
using PostSharp.Aspects; [Serializable] public class MyConvertExeption : OnExceptionAspect { public override void OnException(MethodExecutionArgs args) { throw new MyException("Fehler", args.Exception); } }
namespace PostsharpAspects.Logging { using System; using System.Diagnostics; using System.Reflection; using NLog; using PostSharp.Aspects; using PostSharp.Aspects.Dependencies; [Serializable] [ProvideAspectRole(StandardRoles.PerformanceInstrumentation)] [AspectRoleDependency(AspectDependencyAction.Order, AspectDependencyPosition.After, StandardRoles.Caching)] [AspectRoleDependency(AspectDependencyAction.Order, AspectDependencyPosition.After, StandardRoles.ExceptionHandling)] [AspectRoleDependency(AspectDependencyAction.Commute, StandardRoles.PerformanceInstrumentation)] public class LogTimeAspect : OnMethodBoundaryAspect { private const int SlowTotalMilliseconds = 250; private static readonly Logger Logger = LogManager.GetLogger("LogTimeAspect"); private static readonly Stopwatch Stopwatch = new Stopwatch(); private string instanceName; static LogTimeAspect() { Stopwatch.Start(); } /// <summary> /// Method executed at build time. /// </summary> public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo) { this.instanceName = method.DeclaringType.FullName + "." + method.Name; } /// <summary> /// Saves the time method start /// </summary> [DebuggerStepThrough] public override void OnEntry(MethodExecutionArgs args) { args.MethodExecutionTag = Stopwatch.ElapsedTicks; } /// <summary> /// Stops the time on method end /// </summary> [DebuggerStepThrough] public override void OnExit(MethodExecutionArgs args) { long timeInTicks = Stopwatch.ElapsedTicks - (long)args.MethodExecutionTag; double totalMilliseconds = TimeSpan.FromTicks(timeInTicks).TotalMilliseconds; if (totalMilliseconds > SlowTotalMilliseconds) { Logger.Trace(String.Format("{0}ms\t- {1}", totalMilliseconds, this.instanceName)); } base.OnExit(args); } } }
namespace PostsharpAspects.Caching { using System; using System.Reflection; using System.Text; using PostSharp.Aspects; using PostsharpAspects.Caching.CacheImplementation; [Serializable] public class SimpleCacheBaseAspect : OnMethodBoundaryAspect { protected ICache Cache { get; set; } public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo) { string prefix = method.DeclaringType.ToString(); this.Cache = new Cache(prefix); } public override void OnEntry(MethodExecutionArgs args) { string cacheKey = GenerateCacheKey(args); object value = this.Cache.Get(cacheKey); if (value == null) { args.MethodExecutionTag = cacheKey; return; } args.ReturnValue = value; args.FlowBehavior = FlowBehavior.Return; } public override void OnSuccess(MethodExecutionArgs args) { string cacheKey = (string)args.MethodExecutionTag; this.Cache.Insert(cacheKey, args.ReturnValue); } protected static string GenerateCacheKey(MethodExecutionArgs args) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < args.Arguments.Count; i++) { if (i > 0) { stringBuilder.Append("|"); } stringBuilder.AppendFormat( "{0}_{1}", args.Method.GetParameters()[i].Name, args.Arguments.GetArgument(i) ?? "null"); } return stringBuilder.ToString(); } } }
Vortrag zu AOP bei der .NET User Group Niederrhein
On 07, Apr 2012 | inAOP | vonJohannes Hoppe
Als Entwickler sind wir täglich bemüht hochwertigen und sauberen Code zu produzieren. Für viele Probleme kennen wir bewährte Patterns und Vorgehensweisen. Doch manche Belange – wie etwa Logging, Exception Handling, Validierung oder Caching – liegen schnell unsauber verstreut im gesamten Projekt herum.
Bei dem Treffen der .NET Usergroup Niederrhein spreche ich von meiner Sicht über Clean-Code und die Grenzen von objektorientierter Programmierung. Anhand praktischer Bespiele zeige ich, wie man mit dem AOP-Framework Postsharp elegante Modularisierungsansätze erhält.
Der Vortrag richtet sich an interessierte Einsteiger in das Thema AOP mit .NET.
Sofern bereits Postsharp auf dem Laptop installiert ist, können alle Beispiele Anhand der ASP.NET MVC Demo-Applikation WebNoteAOP nachvollzogen werden.
Vorträge und Termine 2012
On 23, Jan 2012 | inGeneral | vonJohannes Hoppe
Dieses Jahr werde ich auf Konferenzen und User-Groups zu folgenden Themen sprechen:
- 31.01.2012 – VSone – NoSQL
- 20.03.2012 – mongoDB Berlin – Node.js
- 12.04.2012 – .NET UG Niederrhein – AOP
- 10.05.2012 – .NET UG Karlsruhe – NoSQL
- 14.05.2012 – DDC – NoSQL
- 29.08.2012 – .NET UG Braunschweig –
NoSQL Bootcamp - 17.09.2012 – WDC – Node.js & MongoDB
- 18.09.2012 – WDC – WebGL
- 12.10.2012 – NRW Conf – NoSQL
- 16.10.2012 – WebTech Conf – WebGL
- 12.12.2012 – GUI&DESIGN – WebGL
Ich freue mich, euch dort kennen zu lernen!
PostSharp MVP
On 28, Okt 2011 | inAOP | vonJohannes Hoppe
In 2011 I talked and blogged several times about Aspect Oriented Programming (AOP) with .NET and PostSharp.
I’m pleasantly amazed that SharpCrapfters rewarded me with the title:
My blog was a bit pall in last time. That’s mainly because I was rushing from one project to the next one! However, I’m planning to retain that title with some new stuff for you! :-)
[GERMAN] AOP @ .NET Usergroup Rhein-Neckar – Downloads
On 27, Jun 2011 | inAOP | vonJohannes Hoppe
[GERMAN] 8. Treffen der .NET Usergroup Rhein-Neckar am 27.06.2011
On 16, Jun 2011 | inAOP | vonJohannes Hoppe
Als Entwickler sind wir täglich bemüht hochwertigen und sauberen Code zu produzieren. Für viele Probleme kennen wir bewährte Patterns und Vorgehensweisen. Doch manche Belange – wie etwa Logging, Exception Handling, Validierung oder Caching – liegen schnell unsauber verstreut im gesamten Projekt herum.
Bei dem 8. Treffen der .NET Usergroup Rhein-Neckar spreche ich von meiner Sicht über Clean-Code und die Grenzen von objektorientierter Programmierung. Anhand praktischer Bespiele zeige ich, wie man mit dem AOP-Framework Postsharp elegante Modularisierungsansätze erhält.
Der Vortrag richtet sich an interessierte Einsteiger in das AOP mit .NET.
Sofern bereits Postsharp auf dem Laptop installiert ist, können alle Beispiele Anhand der ASP.NET MVC Demo-Applikation WebNoteAOP nachvollzogen werden.