How to use DecorateAllWith to decorate with DynamicProxy all instances implement the interface?
For instance:
public class ApplicationServiceInterceptor : IInterceptor { public void Intercept(IInvocation invocation) {
I could decorate some interfaces for specific types using (for example):
var proxyGenerator = new ProxyGenerator(); registry.For<IApplicationService>().Use<BaseAppService>().DecorateWith(service => proxyGenerator.CreateInterfaceProxyWithTargetInterface(....))
But havent been able to use DecorateAll for this.
To call registry.For<>().Use<>().DecorateWith() , I have to do this:
if (type.CanBeCastTo<IApplicationService>() && !type.IsAbstract) { var interfaceToProxy = type.GetInterface("I" + type.Name); if (interfaceToProxy == null) return null; var proxyGenerator = new ProxyGenerator(); // Build expression to use registration by reflection var expression = BuildExpressionTreeToCreateProxy(proxyGenerator, type, interfaceType, new MyInterceptor()); // Register using reflection var f = CallGenericMethod(registry, "For", interfaceToProxy); var u = CallGenericMethod(f, "Use", type); CallMethod(u, "DecorateWith", expression); }
Only for crazy minds ...
I'm starting to get very tired of StructureMap, a lot of changes and no documentation, I read the source code, but ... too much effort for my purpose ...
If someone can give me some light, I will be grateful.
Thanks in advance.
Also ... I am posting here my real helper code to generate an expression tree to register the plugin family:
public static class RegistrationHelper { public static void RegisterWithInterceptors(this Registry registry, Type interfaceToProxy, Type concreteType, IInterceptor[] interceptors, ILifecycle lifecycle = null) { var proxyGenerator = new ProxyGenerator(); // Generate expression tree to call DecoreWith of StructureMap SmartInstance type // registry.For<interfaceToProxy>().Use<concreteType>() // .DecoreWith(ex => (IApplicationService) // proxyGenerator.CreateInterfaceProxyWithTargetInterface(interfaceToProxy, ex, interceptors) var expressionParameter = Expression.Parameter(interfaceToProxy, "ex"); var proxyGeneratorConstant = Expression.Constant(proxyGenerator); var interfaceConstant = Expression.Constant(interfaceToProxy); var interceptorConstant = Expression.Constant(interceptors); var methodCallExpression = Expression.Call(proxyGeneratorConstant, typeof (ProxyGenerator).GetMethods().First( met => met.Name == "CreateInterfaceProxyWithTargetInterface" && !met.IsGenericMethod && met.GetParameters().Count() == 3), interfaceConstant, expressionParameter, interceptorConstant); var convert = Expression.Convert(methodCallExpression, interfaceToProxy); var func = typeof(Func<,>).MakeGenericType(interfaceToProxy, interfaceToProxy); var expr = Expression.Lambda(func, convert, expressionParameter); // Register using reflection registry.CallGenericMethod("For", interfaceToProxy, new[] {(object) lifecycle /*Lifecicle*/}) .CallGenericMethod("Use", concreteType) .CallNoGenericMethod("DecorateWith", expr); } } public static class CallMethodExtensions { /// <summary> /// Call a method with Generic parameter by reflection (obj.methodName[genericType](parameters) /// </summary> /// <returns></returns> public static object CallGenericMethod(this object obj, string methodName, Type genericType, params object[] parameters) { var metod = obj.GetType().GetMethods().First(m => m.Name == methodName && m.IsGenericMethod); var genericMethod = metod.MakeGenericMethod(genericType); return genericMethod.Invoke(obj, parameters); } /// <summary> /// Call a method without Generic parameter by reflection (obj.methodName(parameters) /// </summary> /// <returns></returns> public static object CallNoGenericMethod(this object obj, string methodName, params object[] parameters) { var method = obj.GetType().GetMethods().First(m => m.Name == methodName && !m.IsGenericMethod); return method.Invoke(obj, parameters); } }