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