Używam Simple Injector w moim projekcie asp.net mvc 4.Używanie Simple Injector z Interceptor Castle Proxy
Nie mogę wymyślić, w jaki sposób mogę użyć Simple Injector z przechwytywaczem proxy zamka.
Używam Simple Injector w moim projekcie asp.net mvc 4.Używanie Simple Injector z Interceptor Castle Proxy
Nie mogę wymyślić, w jaki sposób mogę użyć Simple Injector z przechwytywaczem proxy zamka.
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
.
Naprawdę ładne, ale muszę znaleźć sposób na sprawdzenie. wiele metod statycznych i żadnych szyderstw. –