public override void PreBuildUp(IBuilderContext context)
        {
            Guard.ArgumentNotNull(context, "context");
            if (!this.CanIntercept(context))
            {
                return;
            }
            IInstanceInterceptionPolicy interceptionPolicy = FindInterceptionPolicy <IInstanceInterceptionPolicy>(context, true);

            if (null == interceptionPolicy)
            {
                IInstanceInterceptor interceptor = context.NewBuildUp <IInterceptor>(typeof(IInterceptor).AssemblyQualifiedName) as IInstanceInterceptor;
                if (null == interceptor)
                {
                    return;
                }
                if (!interceptor.CanIntercept(context.BuildKey.Type))
                {
                    return;
                }
                context.Policies.Set <IInstanceInterceptionPolicy>(new FixedInstanceInterceptionPolicy(interceptor), context.BuildKey);
                context.Policies.Clear <ITypeInterceptionPolicy>(context.BuildKey);
            }

            IInterceptionBehaviorsPolicy interceptionBehaviorsPolicy = FindInterceptionPolicy <IInterceptionBehaviorsPolicy>(context, true);

            if (null == interceptionBehaviorsPolicy)
            {
                var policyInjectionBehavior = new InterceptionBehavior <PolicyInjectionBehavior>();
                policyInjectionBehavior.AddPolicies(context.OriginalBuildKey.Type, context.BuildKey.Type, context.BuildKey.Name, context.Policies);
            }
        }
Пример #2
0
        internal static InterceptionBehaviorsPolicy GetOrCreate <TPolicySet>(ref TPolicySet policies)
            where TPolicySet : IPolicySet
        {
            IInterceptionBehaviorsPolicy policy = (IInterceptionBehaviorsPolicy)policies.Get(typeof(IInterceptionBehaviorsPolicy));

            if (!(policy is InterceptionBehaviorsPolicy))
            {
                policy = new InterceptionBehaviorsPolicy();
                policies.Set(typeof(IInterceptionBehaviorsPolicy), policy);
            }
            return((InterceptionBehaviorsPolicy)policy);
        }
        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 InterceptionBehaviorsPolicy GetOrCreate(
            IPolicyList policies,
            Type typeToCreate,
            string name)
        {
            IInterceptionBehaviorsPolicy policy =
                (IInterceptionBehaviorsPolicy)policies.Get(typeToCreate, name, typeof(IInterceptionBehaviorsPolicy), out _);

            if (!(policy is InterceptionBehaviorsPolicy))
            {
                policy = new InterceptionBehaviorsPolicy();
                policies.Set(typeToCreate, name, typeof(IInterceptionBehaviorsPolicy), policy);
            }
            return((InterceptionBehaviorsPolicy)policy);
        }
Пример #5
0
        internal static InterceptionBehaviorsPolicy GetOrCreate(
            IPolicyList policies,
            Type typeToCreate,
            string name)
        {
            NamedTypeBuildKey            key    = new NamedTypeBuildKey(typeToCreate, name);
            IInterceptionBehaviorsPolicy policy =
                policies.GetNoDefault <IInterceptionBehaviorsPolicy>(key, false);

            if (policy == null || !(policy is InterceptionBehaviorsPolicy))
            {
                policy = new InterceptionBehaviorsPolicy();
                policies.Set(policy, key);
            }
            return((InterceptionBehaviorsPolicy)policy);
        }
 /// <summary>
 /// GetOrDefault the set of <see cref="IInterceptionBehavior"/> object to be used for the given type and
 /// interceptor.
 /// </summary>
 /// <remarks>
 /// This method will return a sequence of <see cref="IInterceptionBehavior"/>s. These behaviors will
 /// only be included if their <see cref="IInterceptionBehavior.WillExecute"/> properties are true.
 /// </remarks>
 /// <param name="context">Context for the current build operation.</param>
 /// <param name="interceptor">Interceptor that will be used to invoke the behavior.</param>
 /// <param name="typeToIntercept">Type that interception was requested on.</param>
 /// <param name="implementationType">Type that implements the interception.</param>
 /// <returns></returns>
 public static IEnumerable <IInterceptionBehavior> GetEffectiveBehaviors(this IInterceptionBehaviorsPolicy policy,
                                                                         ref BuilderContext context, IInterceptor interceptor,
                                                                         Type typeToIntercept, Type implementationType)
 {
     return(policy.GetEffectiveBehaviors(context.Container, interceptor, typeToIntercept, implementationType));
 }