/// <summary> /// Creates a child container with all the registrations from the parent container intercepted by globalInterceptors /// and attribute interceptors /// </summary> /// <param name="unityContainer"></param> /// <param name="globalInterceptors"></param> /// <returns></returns> public static IUnityContainer InterceptContainer(IUnityContainer unityContainer, IInterceptor[] globalInterceptors, InterceptionOptions options = null) { options = options ?? new InterceptionOptions(); var childContainer = unityContainer.CreateChildContainer(); foreach (var registration in unityContainer.Registrations) { if (registration.MappedToType.GetInterfaces().Any(x => x == typeof(IInterceptor))) { continue; // no registrar los propios interceptores } if (!registration.RegisteredType.IsInterface) { continue; } if (ReflectionHelper.MustNotIntercept(registration.MappedToType)) { continue; } var allInterceptors = GetInterceptors(unityContainer, globalInterceptors, registration, options); var proxied = ProxyManager.Generator.CreateInterfaceProxyWithTarget(registration.RegisteredType, unityContainer.Resolve(registration.RegisteredType, registration.Name), allInterceptors); childContainer.RegisterFactory(registration.RegisteredType, registration.Name, (c) => proxied); } return(childContainer); }
private static IInterceptor[] GetInterceptors(IUnityContainer unityContainer, IInterceptor[] globalInterceptors, IContainerRegistration registration, InterceptionOptions options) { var attributeInterceptors = ReflectionHelper.GetAttributeInterceptors(registration.MappedToType, unityContainer); var interceptors = new List <IInterceptor>(); if (options.GlobalInterceptorsOrder == GlobalInterceptorsOrder.AfterAttributeInterceptors) { interceptors.AddRange(attributeInterceptors); interceptors.AddRange(globalInterceptors); } else { interceptors.AddRange(globalInterceptors); interceptors.AddRange(attributeInterceptors); } return(ReflectionHelper.RemoveExcludedGlobalInterceptors(registration.MappedToType, interceptors.ToArray())); }
public static IUnityContainer InterceptContainer(IUnityContainer unityContainer, Type[] globalInterceptors, InterceptionOptions options = null) { var interceptorInstances = globalInterceptors.Select(x => unityContainer.Resolve(x) as IInterceptor).ToArray(); return(InterceptContainer(unityContainer, interceptorInstances)); }