/// <summary> /// Called during the chain of responsibility for a build operation. The /// PreBuildUp method is called when the chain is being executed in the /// forward direction. /// </summary> /// <remarks>In this class, PreBuildUp is responsible for figuring out if the /// class is proxyable, and if so, replacing it with a proxy class.</remarks> /// <param name="context">Context of the build operation.</param> public override void PreBuildUp(IBuilderContext context) { Guard.ArgumentNotNull(context, "context"); if (context.Existing != null) { return; } Type typeToBuild = context.BuildKey.Type; var interceptionPolicy = FindInterceptionPolicy <ITypeInterceptionPolicy>(context); if (interceptionPolicy == null) { return; } var interceptor = interceptionPolicy.GetInterceptor(context); if (!interceptor.CanIntercept(typeToBuild)) { return; } var interceptionBehaviorsPolicy = FindInterceptionPolicy <IInterceptionBehaviorsPolicy>(context); IEnumerable <IInterceptionBehavior> interceptionBehaviors = interceptionBehaviorsPolicy == null ? Enumerable.Empty <IInterceptionBehavior>() : interceptionBehaviorsPolicy.GetEffectiveBehaviors( context, interceptor, typeToBuild, typeToBuild) .Where(ib => ib.WillExecute); IAdditionalInterfacesPolicy additionalInterfacesPolicy = FindInterceptionPolicy <IAdditionalInterfacesPolicy>(context); IEnumerable <Type> additionalInterfaces = additionalInterfacesPolicy != null ? additionalInterfacesPolicy.AdditionalInterfaces : Type.EmptyTypes; context.Policies.Set <EffectiveInterceptionBehaviorsPolicy>( new EffectiveInterceptionBehaviorsPolicy { Behaviors = interceptionBehaviors }, context.BuildKey); Type[] allAdditionalInterfaces = Intercept.GetAllAdditionalInterfaces(interceptionBehaviors, additionalInterfaces); Type interceptingType = interceptor.CreateProxyType(typeToBuild, allAdditionalInterfaces); DerivedTypeConstructorSelectorPolicy.SetPolicyForInterceptingType(context, interceptingType); }
/// <summary> /// Called during the chain of responsibility for a build operation. The /// PreBuildUp method is called when the chain is being executed in the /// forward direction. /// </summary> /// <remarks>In this class, PreBuildUp is responsible for figuring out if the /// class is proxyable, and if so, replacing it with a proxy class.</remarks> /// <param name="context">Context of the build operation.</param> public override void PreBuildUp(IBuilderContext context) { if (context.Existing != null) { return; } Type typeToBuild = context.BuildKey.Type; var interceptionPolicy = FindInterceptionPolicy <ITypeInterceptionPolicy>(context); if (interceptionPolicy == null) { return; } var interceptor = interceptionPolicy.GetInterceptor(context); if (!interceptor.CanIntercept(typeToBuild)) { return; } var interceptionBehaviorsPolicy = FindInterceptionPolicy <IInterceptionBehaviorsPolicy>(context); IEnumerable <IInterceptionBehavior> interceptionBehaviors = interceptionBehaviorsPolicy == null ? Enumerable.Empty <IInterceptionBehavior>() : interceptionBehaviorsPolicy.GetEffectiveBehaviors( context, interceptor, typeToBuild, typeToBuild) .Where(ib => ib.WillExecute); IAdditionalInterfacesPolicy additionalInterfacesPolicy = FindInterceptionPolicy <IAdditionalInterfacesPolicy>(context); IEnumerable <Type> additionalInterfaces = additionalInterfacesPolicy != null ? additionalInterfacesPolicy.AdditionalInterfaces : Type.EmptyTypes; var enumerable = interceptionBehaviors as IInterceptionBehavior[] ?? interceptionBehaviors.ToArray(); context.Registration.Set(typeof(EffectiveInterceptionBehaviorsPolicy), new EffectiveInterceptionBehaviorsPolicy { Behaviors = enumerable }); Type[] allAdditionalInterfaces = Intercept.GetAllAdditionalInterfaces(enumerable, additionalInterfaces); Type interceptingType = interceptor.CreateProxyType(typeToBuild, allAdditionalInterfaces); DerivedTypeConstructorSelectorPolicy.SetPolicyForInterceptingType(context, interceptingType); }
public override void PostBuildUp(IBuilderContext context) { Microsoft.Practices.Unity.Utility.Guard.ArgumentNotNull(context, "context"); // If it's already been intercepted, don't do it again. if (context.Existing is IInterceptingProxy) { return; } IInstanceInterceptionPolicy interceptionPolicy = FindInterceptionPolicy <IInstanceInterceptionPolicy>(context, true); if (interceptionPolicy == null) { return; } var interceptor = interceptionPolicy.GetInterceptor(context); IInterceptionBehaviorsPolicy interceptionBehaviorsPolicy = FindInterceptionPolicy <IInterceptionBehaviorsPolicy>(context, true); if (interceptionBehaviorsPolicy == null) { return; } IAdditionalInterfacesPolicy additionalInterfacesPolicy = FindInterceptionPolicy <IAdditionalInterfacesPolicy>(context, false); IEnumerable <Type> additionalInterfaces = additionalInterfacesPolicy != null ? additionalInterfacesPolicy.AdditionalInterfaces : Type.EmptyTypes; Type typeToIntercept = context.OriginalBuildKey.Type; Type implementationType = context.Existing.GetType(); IInterceptionBehavior[] interceptionBehaviors = interceptionBehaviorsPolicy.GetEffectiveBehaviors( context, interceptor, typeToIntercept, implementationType) .ToArray(); if (interceptionBehaviors.Length > 0) { context.Existing = Intercept.ThroughProxyWithAdditionalInterfaces( typeToIntercept, context.Existing, interceptor, interceptionBehaviors, additionalInterfaces); } }
internal static AdditionalInterfacesPolicy GetOrCreate(IPolicyList policies, Type typeToCreate, string name) { NamedTypeBuildKey key = new NamedTypeBuildKey(typeToCreate, name); IAdditionalInterfacesPolicy policy = (IAdditionalInterfacesPolicy)policies.Get(typeToCreate, name, typeof(IAdditionalInterfacesPolicy), out _); if (!(policy is AdditionalInterfacesPolicy)) { policy = new AdditionalInterfacesPolicy(); policies.Set(typeToCreate, name, typeof(IAdditionalInterfacesPolicy), policy); } return((AdditionalInterfacesPolicy)policy); }
internal static AdditionalInterfacesPolicy GetOrCreate( IPolicyList policies, Type typeToCreate, string name) { NamedTypeBuildKey key = new NamedTypeBuildKey(typeToCreate, name); IAdditionalInterfacesPolicy policy = policies.GetNoDefault <IAdditionalInterfacesPolicy>(key, false); if ((policy == null) || !(policy is AdditionalInterfacesPolicy)) { policy = new AdditionalInterfacesPolicy(); policies.Set <IAdditionalInterfacesPolicy>(policy, key); } return((AdditionalInterfacesPolicy)policy); }