Kentico Cloud Пользовательский ContentLinkUrlResolver устраняет циклическую зависимость от DeliveryClient

#kentico-kontent

#kentico-контент

Вопрос:

Я пытаюсь обновить my Kentico Cloud SDK с версии 7 до версии 10. Раньше я просто создавал новый экземпляр DeliveryClient для создания сервиса из URL-адресов моего сайта для разрешения, а затем передавал это в мой customcontentlink curlresolver, например

 services.AddSingleton<NavigationProvider>(c => new NavigationProvider(new DeliveryClient(deliveryOptions) {
    CodeFirstModelProvider = { TypeProvider = new CustomTypeProvider() }
}, cache));

services.AddSingleton<IDeliveryClient>(c => new CachedDeliveryClient(projectOptions, cache)
{
    CodeFirstModelProvider = { TypeProvider = new CustomTypeProvider() },
    ContentLinkUrlResolver = new CustomContentLinkUrlResolver(c.GetRequiredService<NavigationProvider>())
});
  

Итак, у меня есть эта циклическая зависимость, где DeliveryClient зависит от CustomContentLinkUrlResolver, который зависит от DeliveryClient.

Разочаровывающая часть заключается в том, что метод ResolveLinkUrl (ссылка ContentLink) не содержит информации, необходимой для разрешения URL-адресов, поскольку URL-адреса определяются таксономией элемента, который недоступен в ContentLink, что означает, что я должен выполнить другой поиск элемента, чтобы получить таксономию.

Я не знаю, как обойти CustomContentLinkUrlResolver, зависящий от DeliveryClient.

Ответ №1:

Я надеюсь, что я правильно понял вашу ситуацию:

Вы вызываете DeliveryClient экземпляр, созданный как синглтон в контейнере для внедрения зависимостей, и этот клиент использует CustomContentLinkUrlResolver , которому необходимо выполнить другой вызов API для получения информации о таксономии элементов, но вы хотите использовать другой экземпляр DeliveryClient , чтобы избежать циклической зависимости от одноэлементной реализации.

В этом случае можно создать новый экземпляр, DeliveryClient используя DeliveryClientBuilder представленный в версии 8.

 // Sample resolver implementation
public class CustomContentLinkUrlResolver : IContentLinkUrlResolver
{
    public string ResolveLinkUrl(ContentLink link)
    {
        IDeliveryClient client = DeliveryClientBuilder.WithProjectId("<YOUR_PROJECT_ID>").Build();
       // Do the call
       // return URL
    }
}