AOP through Unity interceptors - Logging
The first thing we think when talking about interception is logging. Let's see an implementation of a Logger.
But before introducing the Logger implementation, let us scaffold a console sample project.
Now we can play with unity. In the Program.cs, write this:
Finally, here is the implementation of the LoggingInterceptionBehavior:
But before introducing the Logger implementation, let us scaffold a console sample project.
public interface IFoo { FooItem GetItem(string name); } public interface IStore { StoreItem Get(int id); IEnumerable<StoreItem> GetAll(); void Save(StoreItem item); void ThrowException(); } public class FooImpl : IFoo { public FooItem GetItem(string name) { return new FooItem { Name = name }; } } public class StoreImpl : IStore { public StoreItem Get(int id) { Thread.Sleep(1000); return new StoreItem { Id = id, Name = "Fake name" }; } public IEnumerables<StoreItem> GetAll() { Thread.Sleep(2000); return new List<StoreItem>() { new StoreItem {Id = 1, Name = "Fake Item 1"}, new StoreItem {Id = 2, Name = "Fake Item 2"}, new StoreItem {Id = 3, Name = "Fake Item 3"} }; } public void Save(StoreItem item) { Thread.Sleep(1500); } public void ThrowException() { Thread.Sleep(500); throw new Exception("Sample exception"); } } public class FooItem { public string Name { get; set; } } public class StoreItem { public int Id { get; set; } public string Name { get; set; } }
Now we can play with unity. In the Program.cs, write this:
static void Main(string[] args) { using (var container = new UnityContainer()) { container.AddNewExtension<Interception>(); // Register container.RegisterType<IStore, Storeimpl>( new Interceptor<InterfaceInterceptor>(), new InterceptionBehavior<LoggingInterceptionBehavior>()); container.RegisterType<IFoo fooimpl="">( new Interceptor(), new InterceptionBehavior<LoggingInterceptionBehavior>()); // Resolve IStore store = container.Resolve<IStore>(); IFoo foo = container.Resolve<IFoo>(); // Call store.Get(1); store.Get(2); store.Get(1); store.GetAll(); store.Save(null); try { store.ThrowException(); } catch { } foo.GetItem("Whatever"); Console.WriteLine("END"); Console.ReadLine(); } }
Finally, here is the implementation of the LoggingInterceptionBehavior:
public class LoggingInterceptionBehavior : IInterceptionBehavior { public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) { var arguments = JsonConvert.SerializeObject(input.Arguments); WriteLog(String.Format("Invoking method {0}", input.MethodBase), arguments); var result = getNext()(input, getNext); if (result.Exception != null) { WriteLog(String.Format("Method {0} threw exception {1}", input.MethodBase, result.Exception.Message)); } else { var returnValue = JsonConvert.SerializeObject(result.ReturnValue); WriteLog(String.Format("Method {0} returned successfully", input.MethodBase), returnValue); } return result; } public IEnumerable<Type> GetRequiredInterfaces() { return Type.EmptyTypes; } public bool WillExecute { get { return true; } } private void WriteLog(string message, string args = null) { var utcNow = DateTime.UtcNow; Console.WriteLine( "[{0}]-[{1}]: {2} {3}", utcNow.ToShortDateString(), utcNow.ToLongTimeString(), message, args); } }
Comments
Post a Comment