using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Tapeti.Config; namespace Tapeti.Default { internal class ControllerBindingContext : IControllerBindingContext { private BindingTargetMode? bindingTargetMode; private readonly List middleware = new List(); private readonly List parameters; private readonly ControllerBindingResult result; /// /// Determines how the binding target is configured. /// public BindingTargetMode BindingTargetMode => bindingTargetMode ?? BindingTargetMode.Default; /// /// Provides access to the registered middleware for this method. /// public IReadOnlyList Middleware => middleware; /// public Type MessageClass { get; set; } /// public bool HasMessageClass => MessageClass != null; /// public Type Controller { get; set; } /// public MethodInfo Method { get; set; } /// public IReadOnlyList Parameters => parameters; /// public IBindingResult Result => result; public ControllerBindingContext(IEnumerable parameters, ParameterInfo result) { this.parameters = parameters.Select(parameter => new ControllerBindingParameter(parameter)).ToList(); this.result = new ControllerBindingResult(result); } /// public void SetMessageClass(Type messageClass) { if (HasMessageClass) throw new InvalidOperationException("SetMessageClass can only be called once"); MessageClass = messageClass; } /// public void SetBindingTargetMode(BindingTargetMode mode) { if (bindingTargetMode.HasValue) throw new InvalidOperationException("SetBindingTargetMode can only be called once"); bindingTargetMode = mode; } /// public void Use(IControllerMiddlewareBase handler) { middleware.Add(handler); } /// /// Returns the configured bindings for the parameters. /// public IEnumerable GetParameterHandlers() { return parameters.Select(p => p.Binding); } /// /// Returns the configured result handler. /// /// public ResultHandler GetResultHandler() { return result.Handler; } } /// /// /// Default implementation for IBindingParameter /// public class ControllerBindingParameter : IBindingParameter { /// /// Provides access to the configured binding. /// public ValueFactory Binding { get; set; } /// public ParameterInfo Info { get; } /// public bool HasBinding => Binding != null; /// /// Creates a new default implementation for IBindingParameter /// /// public ControllerBindingParameter(ParameterInfo info) { Info = info; } /// public void SetBinding(ValueFactory valueFactory) { if (Binding != null) throw new InvalidOperationException("SetBinding can only be called once"); Binding = valueFactory; } } /// /// /// Default implementation for IBindingResult /// public class ControllerBindingResult : IBindingResult { /// /// Provides access to the configured handler. /// public ResultHandler Handler { get; set; } /// public ParameterInfo Info { get; } /// public bool HasHandler => Handler != null; /// /// Creates a new default implementation for IBindingResult /// /// public ControllerBindingResult(ParameterInfo info) { Info = info; } /// public void SetHandler(ResultHandler resultHandler) { if (Handler != null) throw new InvalidOperationException("SetHandler can only be called once"); Handler = resultHandler; } } }