Image Image Image Image Image
Scroll to Top

To Top

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!

  1. ActionResult Edit
  2. MyConvertExeption
  3. LogTimeAspect
  4. SimpleCacheBaseAspect


Hier sind alle Code-Fragmente aus dem Video:

ActionResult Edit

[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);
}


MyConvertExeption

using PostSharp.Aspects;
 
[Serializable]
public class MyConvertExeption : OnExceptionAspect
{
    public override void OnException(MethodExecutionArgs args)
    {
        throw new MyException("Fehler", args.Exception);
    }
}

LogTimeAspect

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);
        }
    }
}

SimpleCacheBaseAspect

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();
        }
    }
}

Tags | ,

07

Apr
2012

inAOP

vonJohannes Hoppe

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.

Tags | , ,

23

Jan
2012

inGeneral

vonJohannes Hoppe

Vorträge und Termine 2012

On 23, Jan 2012 | inGeneral | vonJohannes Hoppe

Johannes Hoppe NoSQL Tie

Meet the guy with the great tie!

Dieses Jahr werde ich auf Konferenzen und User-Groups zu folgenden Themen sprechen:

Ich freue mich, euch dort kennen zu lernen!

 

Tags | , , , , ,

28

Okt
2011

inAOP

vonJohannes Hoppe

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:

PostSharp MVP

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! :-)

Tags |

27

Jun
2011

inAOP

vonJohannes Hoppe

[GERMAN] AOP @ .NET Usergroup Rhein-Neckar – Downloads

On 27, Jun 2011 | inAOP | vonJohannes Hoppe

Hier sind die Folien sowie die Beispiel-Anwendung, welche ich während des Vortrags verwende:


Downloads:

 

Tags | , ,

16

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.

Tags | , ,