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);
            }
Example #2
0
        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);
        }
Example #3
0
 public Maybe <string> TryResolve <TContext, TSubject>(IExodataRequest <string, TContext, TSubject> request)
 {
     return(Maybe.If(request.Symbol == CommonExodata.Description, _Description.ToMaybe()));
 }
Example #4
0
 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)));
 }
Example #8
0
 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())));
 }
Example #9
0
 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()));
 }
Example #10
0
        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)));
        }
Example #15
0
 public IEnumerable <IExodataBinding> GetBindingsFor <TExodata, TContext, TSubject>(IExodataRequest <TExodata, TContext, TSubject> request)
 {
     return(_Bindings);
 }
Example #16
0
 protected virtual int CompareBindingPrecidence <TExodata, TContext, TSubject>(IExodataRequest <TExodata, TContext, TSubject> request, IExodataBinding left, IExodataBinding right)
 {
     return(0);
 }