2014-07-01 11 views

Odpowiedz

11

Jest w rzeczywistości section about Interception w prostym wtryskiwaczu documentation, który całkiem wyraźnie opisuje, jak zrobić przechwycenie. Podane tam próbki kodu nie pokazują, jak pracować z Castle DynamicProxy, ale aby to działało, trzeba zmienić kilka linii kodu.

Jeśli używasz Interception Extensions code snippet, aby dostać pracę, trzeba tylko usunąć interfejsy IInterceptor i IInvocation, dodać using Castle.DynamicProxy na początku pliku i zastąpić rodzajowego Interceptor z następujących czynności:

public static class Interceptor 
{ 
    private static readonly ProxyGenerator generator = new ProxyGenerator(); 

    public static object CreateProxy(Type type, IInterceptor interceptor, 
     object target) 
    { 
     return generator.CreateInterfaceProxyWithTarget(type, target, interceptor); 
    } 
} 

Ale przynajmniej byłoby to kod trzeba dostać przechwycenie pracy z Castle DynamicProxy:

using System; 
using System.Linq.Expressions; 
using Castle.DynamicProxy; 
using SimpleInjector; 

public static class InterceptorExtensions 
{ 
    private static readonly ProxyGenerator generator = new ProxyGenerator(); 

    private static readonly Func<Type, object, IInterceptor, object> createProxy = 
     (p, t, i) => generator.CreateInterfaceProxyWithTarget(p, t, i); 

    public static void InterceptWith<TInterceptor>(this Container c, 
     Predicate<Type> predicate) 
     where TInterceptor : class, IInterceptor 
    { 
     c.ExpressionBuilt += (s, e) => 
     { 
      if (predicate(e.RegisteredServiceType)) 
      { 
       var interceptorExpression = 
        c.GetRegistration(typeof(TInterceptor), true).BuildExpression(); 

       e.Expression = Expression.Convert(
        Expression.Invoke(Expression.Constant(createProxy), 
         Expression.Constant(e.RegisteredServiceType, typeof(Type)), 
         e.Expression, 
         interceptorExpression), 
        e.RegisteredServiceType); 
      } 
     }; 
    } 
} 

to jak to wykorzystać:

container.InterceptWith<MonitoringInterceptor>(
    type => type.IsInterface && type.Name.EndsWith("Repository")); 

Umożliwia przechwytywanie wszystkie rejestracje interfejsu, którego nazwa koniec z „Repozytorium” aby zostać przechwycone z nieustalonych MonitoringInterceptor.

+0

Naprawdę ładne, ale muszę znaleźć sposób na sprawdzenie. wiele metod statycznych i żadnych szyderstw. –

Powiązane problemy