protected static void Append <T>(IResource resource, IHypermediaResolver resolver) where T : class, IResource // called using reflection ... { var typed = resource as T; if (typed == null) { throw new ArgumentOutOfRangeException(nameof(resource), "resource must be of type " + typeof(T)); } IHypermediaAppender <T> appender = resolver.ResolveAppender(typed); List <Link> configured = resolver.ResolveLinks(typed).ToList(); Link link = resolver.ResolveSelf(typed); if (link != null) { configured.Insert(0, link); } if (configured.Count > 0 && (appender != null)) { if (typed.Links == null) { typed.Links = new List <Link>(); // make sure resource.Links.Add() can safely be called inside the appender } appender.Append(typed, configured); if ((typed.Links != null) && !typed.Links.Any()) { typed.Links = null; // prevent _links property serialization } } }
public HypermediaConfiguration( ILatestApiVersion version, IHypermediaAppender <ApiError> errorAppender, IHypermediaAppender <ApiVersion> versionAppender, IHypermediaAppender <PagedList <ApiVersion> > versionPagedAppender, IHypermediaAppender <Job> jobAppender, IHypermediaAppender <PagedList <Job> > jobPagedAppender, IHypermediaAppender <JobByDescriptionPagedList> jobByDescriptionPagedAppender, IHypermediaAppender <Schedule> scheduleAppender, IHypermediaAppender <PagedList <Schedule> > schedulePagedAppender, IHypermediaAppender <ScheduleByJobPagedList> scheduleByJobPagedAppender, IHypermediaAppender <ScheduleByDescriptionPagedList> scheduleByDescriptionPagedAppender) { _version = version; _errorAppender = errorAppender; _versionAppender = versionAppender; _versionPagedAppender = versionPagedAppender; _jobAppender = jobAppender; _jobPagedAppender = jobPagedAppender; _jobByDescriptionPagedAppender = jobByDescriptionPagedAppender; _scheduleAppender = scheduleAppender; _schedulePagedAppender = schedulePagedAppender; _scheduleByJobPagedAppender = scheduleByJobPagedAppender; _scheduleByDescriptionPagedAppender = scheduleByDescriptionPagedAppender; _curie = new CuriesLink(Curies.Jobbie, $"https://jobbie-api.com/v{_version}/docs/{{rel}}"); _builder = Hal.Hypermedia.CreateBuilder(); RegisterApiError(); RegisterVersion(); RegisterJob(); RegisterSchedule(); }
public void RegisterAppender <T>(IHypermediaAppender <T> appender) where T : class, IResource { if (appender == null) { throw new ArgumentNullException("appender"); } var type = typeof(T); if (appenders.ContainsKey(type)) { throw new DuplicateHypermediaResolverRegistrationException(type); } appenders.Add(type, appender); }
public static void Register <T>(this IHypermediaBuilder builder, Link <T> selfLink, IHypermediaAppender <T> appender, params Link[] links) where T : class, IResource { if (selfLink == null) { throw new ArgumentNullException("selfLink"); } if (appender == null) { throw new ArgumentNullException("appender"); } builder.RegisterSelf(selfLink); builder.RegisterAppender(appender); builder.RegisterLinks <T>(links); }