#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
}
}