static ExportDescriptorPromise GetDictionaryDefinition <TKey, TValue>(CompositionContract dictionaryContract, CompositionContract valueContract, DependencyAccessor definitionAccessor, string keyByMetadataName)
        {
            return(new ExportDescriptorPromise(
                       dictionaryContract,
                       typeof(IDictionary <TKey, TValue>).Name,
                       false,
                       () => definitionAccessor.ResolveDependencies("value", valueContract, true),
                       deps => {
                var items = deps.Select(d => Tuple.Create(d.Target.Origin, d.Target.GetDescriptor())).ToArray();
                var isValidated = false;
                return ExportDescriptor.Create((c, o) =>
                {
                    if (!isValidated)
                    {
                        Validate <TKey>(items, keyByMetadataName);
                        isValidated = true;
                    }

                    return items.ToDictionary(
                        item => (TKey)item.Item2.Metadata[keyByMetadataName],
                        item => (TValue)item.Item2.Activator(c, o));
                },
                                               NoMetadata);
            }));
        }
        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());
        }
Ejemplo n.º 3
0
        public override IEnumerable <ExportDescriptorPromise> GetExportDescriptors(CompositionContract contract, DependencyAccessor definitionAccessor)
        {
            if (contract.ContractType.IsAbstract ||
                !contract.ContractType.IsClass ||
                !contract.Equals(new CompositionContract(contract.ContractType)))
            {
                return(NoExportDescriptors);
            }

            if (!definitionAccessor.ResolveDependencies("test", contract, false).Any())
            {
                return(NoExportDescriptors);
            }

            return(new[] { new ExportDescriptorPromise(
                               contract,
                               contract.ContractType.Name,
                               false,
                               NoDependencies,
                               _ => ExportDescriptor.Create((c, o) => {
                    var instance = Activator.CreateInstance(contract.ContractType);
                    if (instance is IDisposable)
                    {
                        c.AddBoundInstance((IDisposable)instance);
                    }
                    return instance;
                }, NoMetadata)) });
        }
        public override IEnumerable <ExportDescriptorPromise> GetExportDescriptors(CompositionContract contract, DependencyAccessor descriptorAccessor)
        {
            var implementations = descriptorAccessor.ResolveDependencies("test", contract, false);

            if (!implementations.Any())
            {
                var promise = new ExportDescriptorPromise(
                    contract,
                    contract.ContractType.Name,
                    false,
                    NoDependencies,
                    _ => ExportDescriptor.Create((c, o) =>
                {
                    object export;
                    if ((c.ToString() != "Root Lifetime Context" && c.TryGetExport(typeof(MefServiceScopeFallback), out export) ||
                         c.TryGetExport(typeof(MefServiceRootFallback), out export)) &&
                        export is IMefServiceFallback serviceProvider)
                    {
                        return(serviceProvider.FallbackServiceProvider?.GetService(contract.ContractType));
                    }
                    return(null);
                }, NoMetadata));
                return(new[] { promise });
            }
            return(NoExportDescriptors);
        }
Ejemplo n.º 5
0
            internal IEnumerable <CompositionDependency> Resolve()
            {
                const string site           = "configuration";
                const bool   isPrerequisite = true;
                var          metadata       = new Dictionary <string, object>()
                {
                    ["Key"] = key
                };
                var contract = new CompositionContract(typeof(string), key, metadata);

                return(descriptorAccessor.ResolveDependencies(site, contract, isPrerequisite));
            }
        static ExportDescriptorPromise GetImportManyDescriptor <TElement>(CompositionContract importManyContract, CompositionContract elementContract, DependencyAccessor definitionAccessor)
        {
            return(new ExportDescriptorPromise(
                       importManyContract,
                       typeof(TElement[]).Name,
                       false,
                       () => definitionAccessor.ResolveDependencies("item", elementContract, true),
                       d =>
            {
                var dependentDescriptors = d
                                           .Select(el => el.Target.GetDescriptor())
                                           .ToArray();

                return ExportDescriptor.Create((c, o) => dependentDescriptors.Select(e => (TElement)e.Activator(c, o)).ToArray(), NoMetadata);
            }));
        }
Ejemplo n.º 7
0
            public override IEnumerable <ExportDescriptorPromise> GetExportDescriptors(CompositionContract contract, DependencyAccessor descriptorAccessor)
            {
                if (!contract.Equals(_supportedContract))
                {
                    return(NoExportDescriptors);
                }

                var implementations = descriptorAccessor.ResolveDependencies("test for existing", contract, false);

                if (implementations.Any())
                {
                    return(NoExportDescriptors);
                }

                return(new[] { new ExportDescriptorPromise(contract, "test metadataProvider", false, NoDependencies, _ => ExportDescriptor.Create((c, o) => DefaultObject, NoMetadata)) });
            }
Ejemplo n.º 8
0
 private static ExportDescriptorPromise[] GetLazyDefinitions <TValue>(CompositionContract lazyContract, DependencyAccessor definitionAccessor)
 {
     return(definitionAccessor.ResolveDependencies("value", lazyContract.ChangeType(typeof(TValue)), false)
            .Select(d => new ExportDescriptorPromise(
                        lazyContract,
                        Formatters.Format(typeof(Lazy <TValue>)),
                        false,
                        () => new[] { d },
                        _ =>
     {
         var dsc = d.Target.GetDescriptor();
         var da = dsc.Activator;
         return ExportDescriptor.Create((c, o) => new Lazy <TValue>(() => (TValue)CompositionOperation.Run(c, da)), dsc.Metadata);
     }))
            .ToArray());
 }
Ejemplo n.º 9
0
        public override IEnumerable <ExportDescriptorPromise> GetExportDescriptors(CompositionContract contract, DependencyAccessor descriptorAccessor)
        {
            // Avoid trying to create defaults-of-defaults-of...
            if (contract.ContractName != null && contract.ContractName.StartsWith(DefaultContractNamePrefix))
            {
                return(NoExportDescriptors);
            }

            var implementations = descriptorAccessor.ResolveDependencies("test for default", contract, false);

            if (implementations.Any())
            {
                return(NoExportDescriptors);
            }

            var defaultImplementationDiscriminator         = DefaultContractNamePrefix + (contract.ContractName ?? "");
            IDictionary <string, object> copiedConstraints = null;

            if (contract.MetadataConstraints != null)
            {
                copiedConstraints = contract.MetadataConstraints.ToDictionary(k => k.Key, k => k.Value);
            }
            var defaultImplementationContract = new CompositionContract(contract.ContractType, defaultImplementationDiscriminator, copiedConstraints);

            CompositionDependency defaultImplementation;

            if (!descriptorAccessor.TryResolveOptionalDependency("default", defaultImplementationContract, true, out defaultImplementation))
            {
                return(NoExportDescriptors);
            }

            return(new[] { new ExportDescriptorPromise(
                               contract,
                               "Default Implementation",
                               false,
                               () => new[] { defaultImplementation },
                               _ => {
                    var defaultDescriptor = defaultImplementation.Target.GetDescriptor();
                    return ExportDescriptor.Create((c, o) => defaultDescriptor.Activator(c, o), defaultDescriptor.Metadata);
                }) });
        }
Ejemplo n.º 10
0
        IEnumerable <CompositionDependency> ImportDefinitionToDependency(ImportDefinition def, DependencyAccessor descriptorAccessor)
        {
            var cbid = def as ContractBasedImportDefinition;

            if (cbid == null)
            {
                throw new CompositionFailedException("Only typed (contract-based) import definitions are supported.");
            }

            var contract = ImportDefinitionToContract(cbid);

            switch (cbid.Cardinality)
            {
            case ImportCardinality.ExactlyOne:
                yield return(descriptorAccessor.ResolveRequiredDependency(def, contract, def.IsPrerequisite));

                break;

            case ImportCardinality.ZeroOrOne:
                CompositionDependency result;
                if (descriptorAccessor.TryResolveOptionalDependency(def, contract, def.IsPrerequisite, out result))
                {
                    yield return(result);
                }
                break;

            case ImportCardinality.ZeroOrMore:
                foreach (var item in descriptorAccessor.ResolveDependencies(def, contract, def.IsPrerequisite))
                {
                    yield return(item);
                }
                break;

            default:
                throw new CompositionFailedException("Unsupported cardinality.");
            }
        }