Exemple #1
0
        /// <summary>
        /// Resolves all of the data needs of a supplied dependency and updates
        /// the DependentSupplies property with a list of the supplies it depends on.
        /// If any dependant supplies are dynamic then this supply also becomes dynamic
        /// </summary>
        private void ResolveSuppliedDependencyNeeds(SuppliedDependency dependency)
        {
            var dataConsumer = dependency.DataSupplier as IDataConsumer;

            if (dataConsumer == null)
            {
                return;
            }

            var dependentSupplies = ResolveConsumerNeeds(dataConsumer);

            if (dependentSupplies == null)
            {
                return;
            }

            dependency.DependentSupplies = dependentSupplies;

            foreach (var dynamicSupply in dependentSupplies.Where(s => !s.IsStatic))
            {
                dependency.DataSupply.IsStatic = false;
                dynamicSupply.AddOnSupplyAction(rc =>
                {
                    var dc = rc.GetDataContext(Id);
                    dependency.DataSupply.Supply(rc, dc);
                });
            }
        }
Exemple #2
0
        /// <summary>
        /// Adds a data supplier and specific type of data to supply to this
        /// context without duplicating data in the same scope
        /// </summary>
        private void AddSuppliedDependency(SuppliedDependency suppliedDependency)
        {
            if (_suppliedDependencies.Any(s => Equals(s.DataDependency, suppliedDependency.DataDependency)))
            {
                return;
            }
#if DEBUG
            Trace.WriteLine("Data context builder #" + Id + " adding supplied dependency '" + suppliedDependency + "'");
#endif
            _suppliedDependencies.Add(suppliedDependency);
        }
Exemple #3
0
        private List <IDataSupply> ResolveDataSupplierSupplies(IDataSupplier supplier, IDataDependency dataToSupply, bool addIfMissing)
        {
#if DETAILED_TRACE
            Trace.WriteLine("Data context builder #" + Id + (addIfMissing ? " adding '" : " locating '") + dataToSupply + "' from' " + supplier + "'");
#endif
            var suppliedDependency = _suppliedDependencies == null
                ? null
                : _suppliedDependencies.FirstOrDefault(sd => Equals(sd.DataDependency, dataToSupply));

            if (suppliedDependency != null)
            {
#if DETAILED_TRACE
                Trace.WriteLine("Data context builder #" + Id + " dependency '" + dataToSupply + "' already has a supplier");
#endif
                return(new List <IDataSupply> {
                    suppliedDependency.DataSupply
                });
            }

            if (_parent != null)
            {
                var dependentSupplies = _parent.ResolveDataSupplierSupplies(supplier, dataToSupply, false);
                if (dependentSupplies != null)
                {
#if DETAILED_TRACE
                    Trace.WriteLine("Data context builder #" + Id + " parent was able to resolve the dependency");
#endif
                    return(dependentSupplies);
                }
            }

            if (!addIfMissing)
            {
                return(null);
            }

#if DETAILED_TRACE
            Trace.WriteLine("Data context builder #" + Id + " dependency on '" + dataToSupply + "' must be added");
#endif
            suppliedDependency = new SuppliedDependency(supplier, dataToSupply);
            AddSuppliedDependency(suppliedDependency);

            ResolveConsumerNeeds(supplier as IDataConsumer);

            return(new List <IDataSupply> {
                suppliedDependency.DataSupply
            });
        }
Exemple #4
0
        private List <IDataSupply> ResolveDataDependencySupplies(IDataDependency dependency)
        {
#if DETAILED_TRACE
            Trace.WriteLine("Data context builder #" + Id + " resolving dependency '" + dependency + "'");
#endif
            var suppliedDependency = _suppliedDependencies == null
                ? null
                : _suppliedDependencies.FirstOrDefault(sd => Equals(sd.DataDependency, dependency));

            if (suppliedDependency != null)
            {
#if DETAILED_TRACE
                Trace.WriteLine("Data context builder #" + Id + " dependency '" + dependency + "' already has a supplier");
#endif
                return(new List <IDataSupply> {
                    suppliedDependency.DataSupply
                });
            }

            if (IsInScope(dependency))
            {
#if DETAILED_TRACE
                Trace.WriteLine("Data context builder #" + Id + " dependency '" + dependency + "' is in scope, getting from data catalog");
#endif
                var supplier = _dataCatalog.FindSupplier(dependency);
                if (supplier == null)
                {
                    throw new Exception("The data catalog does not contain a supplier of '" + dependency + "'");
                }

                suppliedDependency = new SuppliedDependency(supplier, dependency);
                AddSuppliedDependency(suppliedDependency);
                return(new List <IDataSupply> {
                    suppliedDependency.DataSupply
                });
            }

#if DETAILED_TRACE
            Trace.WriteLine("Data context builder #" + Id + " dependency '" + dependency + "' is not in scope, passing to parent to resolve");
#endif
            return(_parent.ResolveDataDependencySupplies(dependency));
        }
Exemple #5
0
 /// <summary>
 /// Adds dependent supplied dependencies for a supplied dependency
 /// </summary>
 private void AddSuppliedDependencySupplies(SuppliedDependency suppliedDependency)
 {
     // Nothing to do here, supplied dependencies are ordered to provide
     // dependencies before the supplies that depend on them. This
     // happens after the children have resolved their data needs.
 }