Exemplo n.º 1
0
        public void Map()
        {
            Fx.AssertAndThrow(_expectedStage == Stage.Map, "Map called at the wrong time.");
            _expectedStage = Stage.None;

            List <Tuple <IPersistencePipelineModule, IDictionary <XName, object> > > pendingValues = null;

            foreach (IPersistencePipelineModule module in _modules)
            {
                IDictionary <XName, object> mappedValues = module.MapValues(_readWriteView, _writeOnlyView);
                if (mappedValues != null)
                {
                    if (pendingValues == null)
                    {
                        pendingValues = new List <Tuple <IPersistencePipelineModule, IDictionary <XName, object> > >();
                    }
                    pendingValues.Add(new Tuple <IPersistencePipelineModule, IDictionary <XName, object> >(module, mappedValues));
                }
            }

            if (pendingValues != null)
            {
                foreach (Tuple <IPersistencePipelineModule, IDictionary <XName, object> > writeOnlyValues in pendingValues)
                {
                    foreach (KeyValuePair <XName, object> value in writeOnlyValues.Item2)
                    {
                        try
                        {
                            _values.Add(value.Key, new InstanceValue(value.Value, InstanceValueOptions.Optional | InstanceValueOptions.WriteOnly));
                        }
                        catch (ArgumentException exception)
                        {
                            throw Fx.Exception.AsError(new InvalidOperationException(SRCore.NameCollisionOnMap(value.Key, writeOnlyValues.Item1.GetType().Name), exception));
                        }
                    }
                }

                _writeOnlyView.ResetCaches();
            }

            _expectedStage = Stage.Save;
        }