public void Complete(Exception error)
        {
            _logger.LogDebug("DrainWrites(" + _connectionId + ")");

            var context = new LifetimeContext(_transport, _lifetimeTcs, error);

            _transport.ApplyState(TransportConnectionStates.QueueDrained);

            // Drain the task queue for pending write operations so we don't end the request and then try to write
            // to a corrupted request object.
            _writeQueue.Drain().Catch(_logger).Finally(state =>
            {
                // Ensure delegate continues to use the C# Compiler static delegate caching optimization.
                ((LifetimeContext)state).Complete();
            },
            context);

            if (error != null)
            {
                _logger.LogError("CompleteRequest (" + _connectionId + ") failed: " + error.GetBaseException());
            }
            else
            {
                _logger.LogInformation("CompleteRequest (" + _connectionId + ")");
            }
        }
        public void Run_ValidContextAndAction_ReturnsExpected()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType <LifetimeContext>(export);

                var results = new List <string>();
                void NonPrequisiteAction1() => results.Add("NonPrequisiteAction1");
                void NonPrequisiteAction2() => results.Add("NonPrequisiteAction2");

                void PostCompositionAction1() => results.Add("PostCompositionAction1");
                void PostCompositionAction2() => results.Add("PostCompositionAction2");

                object Activator(LifetimeContext activatorContext, CompositionOperation activatorOperation)
                {
                    Assert.Same(context, activatorContext);

                    activatorOperation.AddNonPrerequisiteAction(NonPrequisiteAction1);
                    activatorOperation.AddNonPrerequisiteAction(NonPrequisiteAction2);

                    activatorOperation.AddPostCompositionAction(PostCompositionAction1);
                    activatorOperation.AddPostCompositionAction(PostCompositionAction2);

                    return("Hi");
                }

                Assert.Equal("Hi", CompositionOperation.Run(context, Activator));
                Assert.Equal(new string[] { "NonPrequisiteAction1", "NonPrequisiteAction2", "PostCompositionAction1", "PostCompositionAction2" }, results);
            }
        }
Esempio n. 3
0
        static object SubscriptionIdActivator(LifetimeContext context, CompositionOperation operation, IEnumerable <CompositionDependency> dependencies)
        {
            var dependency     = dependencies.Single().Target.GetDescriptor();
            var subscriptionId = (string)Run(context, dependency.Activator);

            return(new Guid(subscriptionId));
        }
        static ExportDescriptorPromise[] GetExportFactoryDescriptors <TProduct>(CompositionContract exportFactoryContract, DependencyAccessor definitionAccessor)
        {
            var productContract = exportFactoryContract.ChangeType(typeof(TProduct));
            var boundaries      = new string[0];

            IEnumerable <string> specifiedBoundaries;
            CompositionContract  unwrapped;

            if (exportFactoryContract.TryUnwrapMetadataConstraint(Constants.SharingBoundaryImportMetadataConstraintName, out specifiedBoundaries, out unwrapped))
            {
                productContract = unwrapped.ChangeType(typeof(TProduct));
                boundaries      = (specifiedBoundaries ?? new string[0]).ToArray();
            }

            return(definitionAccessor.ResolveDependencies("product", productContract, false)
                   .Select(d => new ExportDescriptorPromise(
                               exportFactoryContract,
                               Formatters.Format(typeof(ExportFactory <TProduct>)),
                               false,
                               () => new[] { d },
                               _ =>
            {
                var dsc = d.Target.GetDescriptor();
                var da = dsc.Activator;
                return ExportDescriptor.Create((c, o) =>
                {
                    return new ExportFactory <TProduct>(() => {
                        var lifetimeContext = new LifetimeContext(c, boundaries);
                        return Tuple.Create <TProduct, Action>((TProduct)CompositionOperation.Run(lifetimeContext, da), lifetimeContext.Dispose);
                    });
                },
                                               dsc.Metadata);
            }))
                   .ToArray());
        }
Esempio n. 5
0
        public void GetOrCreate_ValidActivatorAfterInitialization_Success()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                CompositionOperation operation = null;
                var value = new object();
                object GetOrCreateActivate(LifetimeContext getOrCreateContext, CompositionOperation getOrCreateOperator)
                {
                    Assert.Same(context, getOrCreateContext);
                    Assert.Same(operation, getOrCreateOperator);

                    return value;
                }
                object Activator(LifetimeContext activatorContext, CompositionOperation activatorOperation)
                {
                    operation = activatorOperation;
                    Assert.Same(value, context.GetOrCreate(1, operation, GetOrCreateActivate));
                    return "Hi";
                }

                Assert.Equal("Hi", CompositionOperation.Run(context, Activator));
                Assert.Same(value, context.GetOrCreate(1, operation, GetOrCreateActivate));
            }
        }
Esempio n. 6
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));
                }
            });
        }
        public void Complete(Exception error)
        {
            _logger.WriteVerbose("DrainWrites(" + _connectionId + ")");

            var context = new LifetimeContext(_transport, _lifetimeTcs, error);

            _transport.ApplyState(TransportConnectionStates.QueueDrained);

            // Drain the task queue for pending write operations so we don't end the request and then try to write
            // to a corrupted request object.
            _writeQueue.Drain().Catch(_logger).Finally(state =>
            {
                // Ensure delegate continues to use the C# Compiler static delegate caching optimization.
                ((LifetimeContext)state).Complete();
            },
                                                       context);

            if (error != null)
            {
                _logger.WriteError("CompleteRequest (" + _connectionId + ") failed: " + error.GetBaseException());
            }
            else
            {
                _logger.WriteInformation("CompleteRequest (" + _connectionId + ")");
            }
        }
Esempio n. 8
0
        static object PersistenceActivator(LifetimeContext context, CompositionOperation operation, IEnumerable <CompositionDependency> dependencies)
        {
            var map = dependencies.ToDictionary(d => d.Contract.ContractType, d => d.Target.GetDescriptor().Activator);
            var queueConfiguration      = (SqlMessageQueueConfiguration)Run(context, map[typeof(SqlMessageQueueConfiguration)]);
            var eventStoreConfiguration = (SqlEventStoreConfiguration)Run(context, map[typeof(SqlEventStoreConfiguration)]);
            var sagaConfiguration       = (SqlSagaStorageConfiguration)Run(context, map[typeof(SqlSagaStorageConfiguration)]);

            return(new SqlPersistence(queueConfiguration, eventStoreConfiguration, sagaConfiguration));
        }
Esempio n. 9
0
        public void AddBoundInstance_NullInstance_ThrowsNullReferenceExceptionOnDisposal()
        {
            CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]);
            Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
            LifetimeContext context = Assert.IsType<LifetimeContext>(export);

            context.AddBoundInstance(null);
            Assert.Throws<NullReferenceException>(() => context.Dispose());
        }
Esempio n. 10
0
        CompositeActivator CreateActivator(IEnumerable <CompositionDependency> dependencies)
        {
            var dependenciesByImport = dependencies.GroupBy(d => (ContractBasedImportDefinition)d.Site, d => d.Target.GetDescriptor());
            var prereqs    = dependenciesByImport.Where(d => d.Key.IsPrerequisite).ToArray();
            var nonprereqs = dependenciesByImport.Where(d => !d.Key.IsPrerequisite).ToArray();
            var unset      = _part.ImportDefinitions.Where(id => !prereqs.Concat(nonprereqs).Any(k => k.Key.Equals((ContractBasedImportDefinition)id))).ToArray();

            CompositeActivator construct = (c, o) =>
            {
                var result = _part.CreatePart();
                if (result is IDisposable)
                {
                    c.AddBoundInstance((IDisposable)result);
                }

                foreach (var pre in prereqs)
                {
                    result.SetImport(pre.Key, DependenciesToExports(c, pre));
                }

                foreach (var un in unset)
                {
                    result.SetImport(un, Enumerable.Empty <Export>());
                }

                o.AddNonPrerequisiteAction(() =>
                {
                    foreach (var np in nonprereqs)
                    {
                        result.SetImport(np.Key, DependenciesToExports(c, np));
                    }
                });

                o.AddPostCompositionAction(() =>
                {
                    result.Activate();
                });

                return(result);
            };

            if (!IsShared)
            {
                return(construct);
            }

            var sharingId = LifetimeContext.AllocateSharingId();
            CompositeActivator constructAndShare = (c, o) => c.GetOrCreate(sharingId, o, construct);

            return((c, o) =>
            {
                var scope = c.FindContextWithin(_boundary);
                return scope.Equals(c) ?
                constructAndShare(scope, o) :
                CompositionOperation.Run(scope, constructAndShare);
            });
        }
Esempio n. 11
0
        private CompositionHost(LifetimeContext rootLifetimeContext)
        {
            if (rootLifetimeContext == null)
            {
                throw new ArgumentNullException(nameof(rootLifetimeContext));
            }

            _rootLifetimeContext = rootLifetimeContext;
        }
Esempio n. 12
0
        public void ToString_NoParent_ReturnsExpected()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                Assert.Equal("Root Lifetime Context", context.ToString());
            }
        }
Esempio n. 13
0
        public void FindContextWithin_UnknownSharingBoundary_ThrowsCompositionFailedException()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                Assert.Throws<CompositionFailedException>(() => context.FindContextWithin("sharingBoundary"));
            }
        }
Esempio n. 14
0
        public void FindContextWithin_NullSharingBoundary_ReturnsRoot()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                Assert.Same(context, context.FindContextWithin(null));
            }
        }
Esempio n. 15
0
        public void GetOrCreate_NullOperation_ThrowsNullReferenceException()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                Assert.Throws<NullReferenceException>(() => context.GetOrCreate(1, null, Activator));
            }
        }
Esempio n. 16
0
        static object SagaStorageConfigurationActivator(LifetimeContext context, CompositionOperation operation, IEnumerable <CompositionDependency> dependencies)
        {
            var dependency       = dependencies.Single().Target.GetDescriptor();
            var connectionString = (string)Run(context, dependency.Activator);
            var builder          = new SqlSagaStorageConfigurationBuilder();

            builder.HasConnectionString(connectionString);

            return(builder.CreateConfiguration());
        }
        public void Run_NullActivator_ThrowsArgumentNullException()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType <LifetimeContext>(export);

                AssertExtensions.Throws <ArgumentNullException>("compositionRootActivator", () => CompositionOperation.Run(context, null));
            }
        }
Esempio n. 18
0
        public void AddBoundInstance_Disposed_ThrowsObjectDisposedException()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);
                context.Dispose();

                Assert.Throws<ObjectDisposedException>(() => context.AddBoundInstance(null));
            }
        }
Esempio n. 19
0
        private object CreateStronglyTypedExportFactoryOfT <T>(Export export)
        {
            Type[] typeArgs    = { typeof(T) };
            Type   constructed = _exportFactoryType.MakeGenericType(typeArgs);

            Func <Tuple <T, Action> > exportLifetimeContextCreator = () => LifetimeContext.GetExportLifetimeContextFromExport <T>(export);

            object[] args = { exportLifetimeContextCreator };

            var instance = Activator.CreateInstance(constructed, args);

            return(instance !);
        }
Esempio n. 20
0
        private object CreateStronglyTypedExportFactoryOfTM <T, M>(Export export)
        {
            Type[] typeArgs    = { typeof(T), typeof(M) };
            Type   constructed = _exportFactoryType.MakeGenericType(typeArgs);

            Func <Tuple <T, Action> > exportLifetimeContextCreator = () => LifetimeContext.GetExportLifetimeContextFromExport <T>(export);
            var metadataView = AttributedModelServices.GetMetadataView <M>(export.Metadata);

            object?[] args = { exportLifetimeContextCreator, metadataView };

            var instance = Activator.CreateInstance(constructed, args);

            return(instance !);
        }
        public DelegateExportDescriptorProvider(Func <object> exportedInstanceFactory, Type contractType, string contractName, IDictionary <string, object> metadata, bool isShared)
            : base(contractType, contractName, metadata)
        {
            if (exportedInstanceFactory == null)
            {
                throw new ArgumentNullException("exportedInstanceFactory");
            }

            // Runs the factory method, validates the result and registers it for disposal if necessary.
            CompositeActivator constructor = (c, o) =>
            {
                var result = exportedInstanceFactory();
                if (result == null)
                {
                    throw new InvalidOperationException("Delegate factory returned null.");
                }

                if (result is IDisposable)
                {
                    c.AddBoundInstance((IDisposable)result);
                }

                return(result);
            };

            if (isShared)
            {
                var sharingId = LifetimeContext.AllocateSharingId();
                _activator = (c, o) =>
                {
                    // Find the root composition scope.
                    var scope = c.FindContextWithin(null);
                    if (scope == c)
                    {
                        // We're already in the root scope, create the instance
                        return(scope.GetOrCreate(sharingId, o, constructor));
                    }
                    else
                    {
                        // Composition is moving up the hierarchy of scopes; run
                        // a new operation in the root scope.
                        return(CompositionOperation.Run(scope, (c1, o1) => c1.GetOrCreate(sharingId, o1, constructor)));
                    }
                };
            }
            else
            {
                _activator = constructor;
            }
        }
Esempio n. 22
0
        static object EventStoreConfigurationActivator(LifetimeContext context, CompositionOperation operation, IEnumerable <CompositionDependency> dependencies, string entityName)
        {
            var dependency       = dependencies.Single().Target.GetDescriptor();
            var connectionString = (string)Run(context, dependency.Activator);
            var builder          = new SqlEventStoreConfigurationBuilder();

            builder.HasConnectionString(connectionString);

            if (!string.IsNullOrEmpty(entityName))
            {
                builder.HasEntityName(entityName);
            }

            return(builder.CreateConfiguration());
        }
        public void AddPostCompositionAction_NullAction_ThrowsArgumentNullException()
        {
            object Activator(LifetimeContext context, CompositionOperation operation)
            {
                AssertExtensions.Throws <ArgumentNullException>("action", () => operation.AddPostCompositionAction(null));
                return(null);
            }

            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType <LifetimeContext>(export);

                CompositionOperation.Run(context, Activator);
            }
        }
Esempio n. 24
0
        public void GetOrCreate_NullActivator_ThrowsNullReferenceException()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                object Activator(LifetimeContext activatorContext, CompositionOperation activatorOperation)
                {
                    Assert.Throws<NullReferenceException>(() => activatorContext.GetOrCreate(1, activatorOperation, null));
                    return "Hi";
                }

                Assert.Equal("Hi", CompositionOperation.Run(context, Activator));
            }
        }
Esempio n. 25
0
        public void AddBoundInstance_NonNullInstance_DisposesInstanceOnDisposal()
        {
            using (CompositionHost host = CompositionHost.CreateCompositionHost(new ExportDescriptorProvider[0]))
            {
                Assert.True(host.TryGetExport(new CompositionContract(typeof(CompositionContext)), out object export));
                LifetimeContext context = Assert.IsType<LifetimeContext>(export);

                var instance = new DisposableInstance();
                context.AddBoundInstance(instance);
                Assert.Equal(0, instance.CalledDisposed);

                context.Dispose();
                Assert.Equal(1, instance.CalledDisposed);

                context.Dispose();
                Assert.Equal(1, instance.CalledDisposed);
            }
        }
Esempio n. 26
0
        /// <summary>
        /// Create the composition host.
        /// </summary>
        /// <returns>The container as an <see cref="CompositionHost"/>.</returns>
        public static CompositionHost CreateCompositionHost(IEnumerable <ExportDescriptorProvider> providers)
        {
            Requires.NotNull(providers, "providers");

            var allProviders = new ExportDescriptorProvider[] {
                new LazyExportDescriptorProvider(),
                new ExportFactoryExportDescriptorProvider(),
                new ImportManyExportDescriptorProvider(),
                new LazyWithMetadataExportDescriptorProvider(),
                new CurrentScopeExportDescriptorProvider(),
                new ExportFactoryWithMetadataExportDescriptorProvider()
            }
            .Concat(providers)
            .ToArray();

            var container = new LifetimeContext(new ExportDescriptorRegistry(allProviders), s_noBoundaries);

            return(new CompositionHost(container));
        }
Esempio n. 27
0
        /// <summary>
        /// Create the composition host.
        /// </summary>
        /// <returns>The container as an <see cref="CompositionHost"/>.</returns>
        public static CompositionHost CreateCompositionHost(IEnumerable <ExportDescriptorProvider> providers)
        {
            if (providers == null)
            {
                throw new ArgumentNullException(nameof(providers));
            }

            var allProviders = new ExportDescriptorProvider[] {
                new LazyExportDescriptorProvider(),
                new ExportFactoryExportDescriptorProvider(),
                new ImportManyExportDescriptorProvider(),
                new LazyWithMetadataExportDescriptorProvider(),
                new CurrentScopeExportDescriptorProvider(),
                new ExportFactoryWithMetadataExportDescriptorProvider()
            }
            .Concat(providers)
            .ToArray();

            var container = new LifetimeContext(new ExportDescriptorRegistry(allProviders), s_noBoundaries);

            return(new CompositionHost(container));
        }
        public void Complete(Exception error)
        {
            _trace.TraceEvent(TraceEventType.Verbose, 0, "DrainWrites(" + _connectionId + ")");

            var context = new LifetimeContext(_lifetimeTcs, error);

            // Drain the task queue for pending write operations so we don't end the request and then try to write
            // to a corrupted request object.
            _writeQueue.Drain().Catch().Finally(state =>
            {
                // Ensure delegate continues to use the C# Compiler static delegate caching optimization.
                ((LifetimeContext)state).Complete();
            },
            context);

            if (error != null)
            {
                _trace.TraceEvent(TraceEventType.Error, 0, "CompleteRequest (" + _connectionId + ") failed: " + error.GetBaseException());
            }
            else
            {
                _trace.TraceInformation("CompleteRequest (" + _connectionId + ")");
            }
        }
Esempio n. 29
0
        private CompositionHost(LifetimeContext rootLifetimeContext)
        {
            Requires.NotNull(rootLifetimeContext, "rootLifetimeContext");

            _rootLifetimeContext = rootLifetimeContext;
        }
 public object CompositeActivator(LifetimeContext context, CompositionOperation operation)
 {
     CalledCompositeActivator++;
     return(Result);
 }
Esempio n. 31
0
 private static object Activator(LifetimeContext context, CompositionOperation operation) => null;
 public static object Run(LifetimeContext outermostLifetimeContext, CompositeActivator compositionRootActivator);
Esempio n. 33
0
 public void AllocateSharingId_InvokeMultipleTimes_ReturnsDifferentValue()
 {
     Assert.NotEqual(LifetimeContext.AllocateSharingId(), LifetimeContext.AllocateSharingId());
 }