private static IEnumerable <NamedResolutionAttempt <ProviderSetup> > TryResolveGroupReadWriters(IResolutionContext x, string[] mappedReadWriterKeys)
        {
            var readWriters = mappedReadWriterKeys.Select(s =>
            {
                var resolveResult = x.TryResolve <ProviderSetup>(s);
                return(resolveResult);
            })
                              //.Where(y => y.Success).Select(y => y.Value)
                              .OrderBy(y => y.Success ? y.Value.PriorityOrdinal : 999).ToList();

            return(readWriters);
        }
Esempio n. 2
0
        private static IEnumerable<NamedResolutionAttempt<ReadonlyProviderSetup>> TryResolveGroupReaders(IResolutionContext ctx, string[] mappedReaderKeys)
        {
            // First get the readers. Not all specified reader keys might exist if a provider is just read-write,
            // so for any that we don't find, we'll try to resolve a writer that matches the key

            var readerResolutionAttempts = mappedReaderKeys.Select(s =>
                                                           {
                                                               var resolveResult = ctx.TryResolve<ReadonlyProviderSetup>(s);
                                                               return resolveResult;
                                                           })
                //.Where(y => y.Success).Select(y => y.Value).ToList();
                .OrderBy(x => x.Success ? x.Value.PriorityOrdinal : 999).ToList();

            // These readers were not found
            var notFoundReaderKeys = readerResolutionAttempts.Where(y => !y.Success).Select(y => y.Key).ToArray();

            // So try to resolve writers with matching keys
            var tryFindWriters = TryResolveGroupReadWriters(ctx, notFoundReaderKeys);

            // We need to return a sequence of ResolutionAttempt<ReadonlyProviderSetup>
            // Where we have found neither a reader nor a writer, need to include the error from both
            var expressWritersAsReaders = tryFindWriters
                .Select(y => 
                    {
                        if (!y.Success)
                        {
                            return new NamedResolutionAttempt<ReadonlyProviderSetup>(y.Key, y.Error);
                        }

                        var providerSetup = y.Value;
                        var newProviderSetup = (providerSetup is UninstalledProviderSetup)
                                                   ? new UninstalledReadonlyProviderSetup(
                                                         providerSetup.ProviderMetadata,
                                                         providerSetup.FrameworkContext,
                                                         providerSetup.Bootstrapper,
                                                         providerSetup.PriorityOrdinal)
                                                   : new ReadonlyProviderSetup(
                                                         new ReadonlyProviderUnitFactory
                                                             (providerSetup.UnitFactory.EntityRepositoryFactory),
                                                         providerSetup.ProviderMetadata,
                                                         providerSetup.FrameworkContext,
                                                         providerSetup.Bootstrapper,
                                                         providerSetup.PriorityOrdinal);

                        return new NamedResolutionAttempt<ReadonlyProviderSetup>(y.Key, true, newProviderSetup);
                    });

            // Where the reader and writer resolution attempts contain the same key, 
            // we need to merge the error messages for the caller if it wasn't a success
            // or overwrite the values if it was

            // First get a sequence of the readers we know we can return
            var totalItemsToReturn =
                new List<NamedResolutionAttempt<ReadonlyProviderSetup>>(
                    readerResolutionAttempts.Where(x => !notFoundReaderKeys.Contains(x.Key)));

            // Now check the items where we tried to resolve a reader, and then had to try to resolve a writer
            var keysInBoth = readerResolutionAttempts.Select(x => x.Key).Intersect(expressWritersAsReaders.Select(x => x.Key));
            foreach (var key in keysInBoth)
            {
                var originalReaderAttempt = readerResolutionAttempts.FirstOrDefault(x => x.Key == key);
                var writerAttempt = expressWritersAsReaders.FirstOrDefault(x => x.Key == key);
                if (originalReaderAttempt != null && writerAttempt != null)
                    if (!writerAttempt.Success)
                    {
                        totalItemsToReturn.Add(new NamedResolutionAttempt<ReadonlyProviderSetup>(writerAttempt.Key,
                            new InvalidOperationException("Could not resolve a writer or a reader for key {0}. \nReader error: {1}. \nWriter error: {2}"
                                                              .InvariantFormat(key, originalReaderAttempt.Error.ToString(),
                                                                               writerAttempt.Error.ToString()))));
                    }
                    else
                    {
                        totalItemsToReturn.Add(writerAttempt);
                    }
            }

            // Now return the total set
            return totalItemsToReturn.OrderBy(x => x.Success ? x.Value.PriorityOrdinal : 999);
        }
Esempio n. 3
0
        private static IEnumerable<NamedResolutionAttempt<ProviderSetup>> TryResolveGroupReadWriters(IResolutionContext x, string[] mappedReadWriterKeys)
        {
            var readWriters = mappedReadWriterKeys.Select(s =>
                                                              {
                                                                  var resolveResult = x.TryResolve<ProviderSetup>(s);
                                                                  return resolveResult;
                                                              })
                //.Where(y => y.Success).Select(y => y.Value)
                .OrderBy(y => y.Success ? y.Value.PriorityOrdinal : 999).ToList();

            return readWriters;
        }
        private static IEnumerable <NamedResolutionAttempt <ReadonlyProviderSetup> > TryResolveGroupReaders(IResolutionContext ctx, string[] mappedReaderKeys)
        {
            // First get the readers. Not all specified reader keys might exist if a provider is just read-write,
            // so for any that we don't find, we'll try to resolve a writer that matches the key

            var readerResolutionAttempts = mappedReaderKeys.Select(s =>
            {
                var resolveResult = ctx.TryResolve <ReadonlyProviderSetup>(s);
                return(resolveResult);
            })
                                           //.Where(y => y.Success).Select(y => y.Value).ToList();
                                           .OrderBy(x => x.Success ? x.Value.PriorityOrdinal : 999).ToList();

            // These readers were not found
            var notFoundReaderKeys = readerResolutionAttempts.Where(y => !y.Success).Select(y => y.Key).ToArray();

            // So try to resolve writers with matching keys
            var tryFindWriters = TryResolveGroupReadWriters(ctx, notFoundReaderKeys);

            // We need to return a sequence of ResolutionAttempt<ReadonlyProviderSetup>
            // Where we have found neither a reader nor a writer, need to include the error from both
            var expressWritersAsReaders = tryFindWriters
                                          .Select(y =>
            {
                if (!y.Success)
                {
                    return(new NamedResolutionAttempt <ReadonlyProviderSetup>(y.Key, y.Error));
                }

                var providerSetup    = y.Value;
                var newProviderSetup = (providerSetup is UninstalledProviderSetup)
                                                   ? new UninstalledReadonlyProviderSetup(
                    providerSetup.ProviderMetadata,
                    providerSetup.FrameworkContext,
                    providerSetup.Bootstrapper,
                    providerSetup.PriorityOrdinal)
                                                   : new ReadonlyProviderSetup(
                    new ReadonlyProviderUnitFactory
                        (providerSetup.UnitFactory.EntityRepositoryFactory),
                    providerSetup.ProviderMetadata,
                    providerSetup.FrameworkContext,
                    providerSetup.Bootstrapper,
                    providerSetup.PriorityOrdinal);

                return(new NamedResolutionAttempt <ReadonlyProviderSetup>(y.Key, true, newProviderSetup));
            });

            // Where the reader and writer resolution attempts contain the same key,
            // we need to merge the error messages for the caller if it wasn't a success
            // or overwrite the values if it was

            // First get a sequence of the readers we know we can return
            var totalItemsToReturn =
                new List <NamedResolutionAttempt <ReadonlyProviderSetup> >(
                    readerResolutionAttempts.Where(x => !notFoundReaderKeys.Contains(x.Key)));

            // Now check the items where we tried to resolve a reader, and then had to try to resolve a writer
            var keysInBoth = readerResolutionAttempts.Select(x => x.Key).Intersect(expressWritersAsReaders.Select(x => x.Key));

            foreach (var key in keysInBoth)
            {
                var originalReaderAttempt = readerResolutionAttempts.FirstOrDefault(x => x.Key == key);
                var writerAttempt         = expressWritersAsReaders.FirstOrDefault(x => x.Key == key);
                if (originalReaderAttempt != null && writerAttempt != null)
                {
                    if (!writerAttempt.Success)
                    {
                        totalItemsToReturn.Add(new NamedResolutionAttempt <ReadonlyProviderSetup>(writerAttempt.Key,
                                                                                                  new InvalidOperationException("Could not resolve a writer or a reader for key {0}. \nReader error: {1}. \nWriter error: {2}"
                                                                                                                                .InvariantFormat(key, originalReaderAttempt.Error.ToString(),
                                                                                                                                                 writerAttempt.Error.ToString()))));
                    }
                    else
                    {
                        totalItemsToReturn.Add(writerAttempt);
                    }
                }
            }

            // Now return the total set
            return(totalItemsToReturn.OrderBy(x => x.Success ? x.Value.PriorityOrdinal : 999));
        }