Men skal vi have pyntet paa den kaldte side bliver vi noedt til at bruge noget AOP.
Vi starter med at kombinere med singleton.
Foerste henter vi lige de kaldte ud i et eget namespace i egen source og egen dll (det er ikke absolut noedvendigt - men det separate namespace goer det lidt nemmere at select hvad man skal logge):
using System;
namespace EE
{
public class Foo
{
public void A()
{
Console.WriteLine("A");
}
public void B()
{
Console.WriteLine("B");
}
}
public class Bar
{
public void C()
{
Console.WriteLine("C");
}
public void D()
{
Console.WriteLine("D");
}
}
}
using System;
using System.Collections.Generic;
using System.Threading;
using EE;
namespace E
{
public class Person
{
public string Name { get; set; }
}
public class ResponsibleHolder
{
private static ResponsibleHolder instance = null;
private static object mylock = new object();
private Dictionary<int, Person> responsible;
private ResponsibleHolder()
{
responsible = new Dictionary<int, Person>();
}
public static ResponsibleHolder Instance
{
get
{
lock(mylock)
{
if(instance == null)
{
instance = new ResponsibleHolder();
}
}
return instance;
}
}
public Person Responsible
{
get
{
lock(responsible)
{
return responsible[Thread.CurrentThread.ManagedThreadId];
}
}
set
{
lock(responsible)
{
responsible[Thread.CurrentThread.ManagedThreadId] = value;
}
}
}
}
public class ApplicationLogic
{
public void DoSomethings()
{
ResponsibleHolder.Instance.Responsible = new Person { Name="Arne" };
Foo foo = new Foo();
foo.A();
foo.B();
Bar bar = new Bar();
bar.C();
bar.D();
}
}
public class Program
{
public static void Main(string[] args)
{
ApplicationLogic app = new ApplicationLogic();
app.DoSomethings();
}
}
}
Og saa pointen - et aspect som faar det til at virke:
using System;
using Vajhoej.StaticWeaver;
using E;
namespace EEE
{
[Aspect]
public class SingletonLogAspect
{
[Pointcut(Signature="* EE.*::*(*)")]
public static void LogPointcut() { }
[BeforeCallAdvice(Pointcut="LogPointcut")]
public static void Log(MethodJoinpoint mjp)
{
Console.WriteLine(ResponsibleHolder.Instance.Responsible.Name + " calling " + mjp.TypeName + "." + mjp.MethodName);
}
}
}
Nu er logningen flyttet fra de enkelte klasser/metoder over i et enkelt sted - nemlig et aspect.