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); }
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)); }