restructure LinkResolver for better extensibility