using Microsoft.Extensions.Logging; namespace zero.Routing; public class Links : ILinks { protected IZeroStore Store { get; set; } protected ILogger Logger { get; set; } protected IEnumerable Providers { get; set; } public Links(IZeroStore store, ILogger logger, IEnumerable providers) { Store = store; Logger = logger; Providers = providers; } /// public T GetProvider() where T : class, ILinkProvider { Type type = typeof(T); return Providers.FirstOrDefault(x => x.GetType().IsAssignableFrom(type)) as T; } /// public async Task GetUrl(Link link) { ILinkProvider provider = Providers.LastOrDefault(x => x.CanProcess(link)); if (provider == null) { Logger.LogWarning("Could not find provider for link with area {area}", link.Area); return null; } return await provider.Resolve(link); } /// public async Task> GetUrls(params Link[] links) { Dictionary result = new(); foreach (Link link in links) { result.Add(link, await GetUrl(link)); } return result; } /// public ILinkProvider GetProvider(Link link) { return Providers.LastOrDefault(x => x.CanProcess(link)); } } public interface ILinks { /// /// Get URL from a link object by finding a provider which can resolve the link /// Task GetUrl(Link link); /// /// Get URLs from link objects by finding matching providers /// Task> GetUrls(params Link[] links); /// /// Get the provider for a specific link /// ILinkProvider GetProvider(Link link); /// /// Find a provider by a specific type /// T GetProvider() where T : class, ILinkProvider; }