Пользовательская библиотека Kentico Cloud ContentLinkUrlResolver циклическая зависимость от DeliveryClient - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь обновить мой Kentico Cloud SDK с версии 7 до версии 10. До того, как я просто создал новый экземпляр DeliveryClient для создания службы URL-адресов моего сайта, чтобы разрешить их, а затем передать их в мой CustomContentLinkUrlResolver, например,

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 Ответ

0 голосов
/ 29 марта 2019

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

Вы вызываете 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
    }
}

...