private static void FindAndRegisterViewportToRouterService(Dispatcher dispatcher, DependencyObject d)
    {
        var service = WalkAncestorsForRouterService(d);

        if (service == null)
        {
            RoutingComponentsHelperLogHelper.LogRouterServiceNotFoundMessage();

            dispatcher.DelayInvoke(
                DelayBetweenAncestorsWalks,
                () => FindAndRegisterViewportToRouterService(dispatcher, d));
        }
        else
        {
            RoutingComponentsHelperLogHelper.LogRouterServiceFoundMessage(service);
            RegisterViewportWithService(service, d as FrameworkElement);
        }
    }
    private static void RegisterViewportWithService(RouterService service, FrameworkElement control)
    {
        var viewportName          = RoutingComponent.GetViewportName(control);
        var viewportAdapterOption = ControlViewportAdapterFactory.GetControlViewportAdapter(control);

        viewportAdapterOption.Match(
            some: viewportAdapter =>
        {
            RoutingComponentsHelperLogHelper.LogRegisteringViewportMessage(service, control, viewportName);

            service.RegisterViewport(viewportName, viewportAdapter);

            RoutingComponentsHelperLogHelper.LogViewportRegisteredMessage(service, control, viewportName);
        },
            none: () =>
        {
            RoutingComponentsHelperLogHelper.LogViewportAdapterNotFoundMessage(service, control);
        });
    }