예제 #1
0
        public override CompositeActivator RewriteActivator(
            TypeInfo partType,
            CompositeActivator activatorBody,
            IDictionary <string, object> partMetadata,
            IEnumerable <CompositionDependency> dependencies)
        {
            if (!ContractHelpers.IsShared(partMetadata))
            {
                return(activatorBody);
            }

            object sharingBoundaryMetadata;

            if (!partMetadata.TryGetValue(SharingBoundaryPartMetadataName, out sharingBoundaryMetadata))
            {
                sharingBoundaryMetadata = null;
            }

            var sharingBoundary = (string)sharingBoundaryMetadata;
            var sharingKey      = LifetimeContext.AllocateSharingId();

            return((c, o) =>
            {
                var scope = c.FindContextWithin(sharingBoundary);
                if (object.ReferenceEquals(scope, c))
                {
                    return scope.GetOrCreate(sharingKey, o, activatorBody);
                }
                else
                {
                    return CompositionOperation.Run(scope, (c1, o1) => c1.GetOrCreate(sharingKey, o1, activatorBody));
                }
            });
        }