private bool Matches(IExodataRequest <TExodata, TContext, TSubject> request) { Guard.NotNull(request, "request"); if (Symbol.HasValue && Symbol.Value != request.Symbol) { return(false); } if (request.Member == null && Members != null && Members.Length > 0) { return(false); } if (request.Member != null && (Members == null || Members.Contains(request.Member) != true)) { return(false); } if (Context.HasValue && !request.Context.HasValue) { return(false); } if (Context.HasValue && !EqualityComparer <TContext> .Default.Equals(request.Context.Value, Context.Value)) { return(false); } if (Subject.HasValue && !request.Subject.HasValue) { return(false); } if (Subject.HasValue && !EqualityComparer <TSubject> .Default.Equals(request.Subject.Value, Subject.Value)) { return(false); } if (Predicate != null) { return(Predicate(request)); } return(true); }
public Maybe <TExodata> TryResolve <TExodata, TContext, TSubject>(IExodataRequest <TExodata, TContext, TSubject> request) { Guard.NotNull(request, "request"); if (request.Symbol == null) { throw new ArgumentException("The request's symbol must not be null.", "request"); } var candidateBindings = GetBindingSources() .SelectMany(x => x.GetBindingsFor(request)) .Select(x => new { Binding = x, Result = x.TryResolve(request) }) .Where(x => x.Result.HasValue) .ToList(); if (candidateBindings.Count > 0) { candidateBindings.Sort((l, r) => CompareBindingPrecidence(request, l.Binding, r.Binding)); var finalBindings = candidateBindings .TakeWhile( (x, i) => i == 0 || CompareBindingPrecidence(request, candidateBindings[i - 1].Binding, x.Binding) == 0) .ToArray(); if (finalBindings.Length > 1) { return(Maybe.Throw <TExodata>(new AmbiguousExodataBindingsException("More than one Exodata binding was found. Remove duplicate bindings or apply additional conditions to existing bindings to make them unambiguous.", finalBindings.Select(x => x.Binding)))); } if (finalBindings.Length == 1) { return(finalBindings[0].Result); } } return(Maybe <TExodata> .NoValue); }
public Maybe <string> TryResolve <TContext, TSubject>(IExodataRequest <string, TContext, TSubject> request) { return(Maybe.If(request.Symbol == CommonExodata.Description, _Description.ToMaybe())); }
public RequestAdapter(IExodataRequest <TSourceExodata, TSourceContext, TSourceSubject> request) { _Request = request; }
IEnumerable <IExodataBinding> IExodataBindingSource.GetBindingsFor <TExodata, TContext, TRequestSubject>(IExodataRequest <TExodata, TContext, TRequestSubject> request) { return(_Bindings); }
protected override int CompareBindingPrecidence <TExodata, TContext, TSubject>(IExodataRequest <TExodata, TContext, TSubject> request, IExodataBinding left, IExodataBinding right) { var l = left as IExodataBindingDetails; var r = right as IExodataBindingDetails; if (left == null || right == null) { return(0); } bool leftIsAttributeBinding = l.Source is AttributeExodataBindingSource; bool rightIsAttributeBinding = r.Source is AttributeExodataBindingSource; if (leftIsAttributeBinding ^ rightIsAttributeBinding) { return(leftIsAttributeBinding ? 1 : -1); } bool leftBoundToContext = l.BoundToContextInstance; bool rightBoundToContext = r.BoundToContextInstance; if (leftBoundToContext ^ rightBoundToContext) { return(leftBoundToContext ? -1 : 1); } bool leftBoundToSubject = l.BoundToSubjectInstance; bool rightBoundToSubject = r.BoundToSubjectInstance; if (leftBoundToSubject ^ rightBoundToSubject) { return(leftBoundToSubject ? -1 : 1); } bool leftBoundToSymbol = l.BoundToSymbolInstance; bool rightBoundToSymbol = r.BoundToSymbolInstance; if (leftBoundToSymbol ^ rightBoundToSymbol) { return(leftBoundToSymbol ? -1 : 1); } if (l.ContextType != r.ContextType) { return(l.ContextType.IsAssignableFrom(r.ContextType) ? 1 : -1); } if (l.SubjectType != r.SubjectType) { return(l.SubjectType.IsAssignableFrom(r.SubjectType) ? 1 : -1); } return(0); }
public IEnumerable <IExodataBinding> GetBindingsFor <TExodata, TContext, TSubject>(IExodataRequest <TExodata, TContext, TSubject> request) { return(_Parent._Modules .SelectMany(x => x.GetBindingsFor(request))); }
public Maybe <int> TryResolve <TContext, TSubject>(IExodataRequest <int, TContext, TSubject> request) { return(Maybe.If(request.Symbol == StringExodata.MinLength, _MinLength.ToMaybe()) .Or(Maybe.If(request.Symbol == StringExodata.MaxLength, _MaxLength.ToMaybe()))); }
public Maybe <StringExodataDefinition> TryResolve <TContext, TSubject>(IExodataRequest <StringExodataDefinition, TContext, TSubject> request) { return(Maybe.If(request.Symbol == StringExodata.All || request.Symbol == CommonExodata.All, new StringExodataDefinition(_MinLength, _MaxLength, _Description).ToMaybe())); }
public IEnumerable <IExodataBinding> GetBindingsFor <TExodata, TContext, TSubject>(IExodataRequest <TExodata, TContext, TSubject> request) { Type subjectType = typeof(TSubject); return(_Surrogates.Value .Where(x => x.Key.IsAssignableFrom(subjectType)) .Select(x => x.Value) .SelectMany(x => x.GetBindingsFor(request))); }
public Maybe <TRequestExodata> TryResolve <TRequestExodata, TRequestContext, TRequestSubject>(IExodataRequest <TRequestExodata, TRequestContext, TRequestSubject> request) { return(ExodataRequest <TExodata, TContext, TSubject> .TryToAdapt(request) .Where(Matches) .SelectMaybe(ValueFactory) .Cast <TRequestExodata>()); }
public Maybe <TRequestExodata> TryResolve <TRequestExodata, TContext, TSubject>(IExodataRequest <TRequestExodata, TContext, TSubject> request) { return(ExodataRequest <TExodata, TContext, TSubject> .TryToAdapt(request) .SelectMaybe(r => _Attribute.TryResolve(r)) .Cast <TRequestExodata>()); }
public IEnumerable <IExodataBinding> GetBindingsFor <TExodata, TContext, TSubject>(IExodataRequest <TExodata, TContext, TSubject> request) { Guard.NotNull(request, "request"); ICustomAttributeProvider provider = request.Member ?? request.Subject .Where(x => x != null) .Select(x => x.GetType()) .ValueOrDefault(typeof(TSubject)); return(_Bindings[provider] .Select(x => ExodataBinding.Create <TExodata, object, TSubject>(null, this, Maybe <ISymbol> .NoValue, Maybe <object> .NoValue, request.Subject, request.Member != null ? new[] { request.Member } : null, null, r => x.TryResolve(r).AsMaybe()))); }
public IEnumerable <IExodataBinding> GetBindingsFor <TExodata, TContext, TSubject>(IExodataRequest <TExodata, TContext, TSubject> request) { Type subjectType = typeof(TSubject); if (_Surrogates == null) { lock (_syncLock) { if (_Surrogates == null) { _Surrogates = ScanForSurrogates().ToArray(); } } } return(_Surrogates .Where(x => x.Key.IsAssignableFrom(subjectType)) .Select(x => x.Value) .SelectMany(x => x.GetBindingsFor(request))); }
public IEnumerable <IExodataBinding> GetBindingsFor <TExodata, TContext, TSubject>(IExodataRequest <TExodata, TContext, TSubject> request) { return(_Bindings); }
protected virtual int CompareBindingPrecidence <TExodata, TContext, TSubject>(IExodataRequest <TExodata, TContext, TSubject> request, IExodataBinding left, IExodataBinding right) { return(0); }