Как использовать несколько глобальных реализаций ISiteMapNodeVisibilityProvider одновременно? - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь перенести следующий код StructureMap из официальной документации MvcSiteMapProvider в Castle Windsor.

// Visibility Providers

// Explicitly set the visibility providers, using CompositeSiteMapNodeVisibilityProvider to combine the AclModuleVisibilityProvider
// with all other ISiteMapNodeVisibilityProvider implementations.
this.For<ISiteMapNodeVisibilityProviderStrategy>().Use<SiteMapNodeVisibilityProviderStrategy>()
    .EnumerableOf<ISiteMapNodeVisibilityProvider>().Contains(x =>
        {
            x.Type<CompositeSiteMapNodeVisibilityProvider>()
                .Ctor<string>("instanceName").Is("filteredAndTrimmedAndCustom")
                .EnumerableOf<ISiteMapNodeVisibilityProvider>().Contains(y =>
                    {
                        // Note that the visibility providers are executed in
                        // the order specified here, but execution stops when
                        // the first visibility provider returns false.
                        y.Type<FilteredSiteMapNodeVisibilityProvider>();
                        y.Type<TrimEmptyGroupingNodesVisibilityProvider>();
                        y.Type<CustomVisibilityProvider>();
                    });
        })
    .Ctor<string>("defaultProviderName").Is("filteredAndTrimmedAndCustom");

Вот мой код для Castle Windsor:

// Visibility Providers
container.Register(
  Component.For<ISiteMapNodeVisibilityProvider>()
    .Named("filteredAndTrimmedAndCustom")
    .ImplementedBy<CompositeSiteMapNodeVisibilityProvider>()
    .DependsOn(Dependency.OnValue(
        "instanceName",
        "filteredAndTrimmedAndCustom"))
    .DependsOn(Dependency.OnComponentCollection(
        typeof(FilteredSiteMapNodeVisibilityProvider),
        typeof(TrimEmptyGroupingNodesVisibilityProvider),
        typeof(CustomVisibilityProvider))));
container.Register(
  Component.For<ISiteMapNodeVisibilityProviderStrategy>()
    .ImplementedBy<SiteMapNodeVisibilityProviderStrategy>()
    .DependsOn(Dependency.OnValue(
        "defaultProviderName",
        "filteredAndTrimmedAndCustom")));

Проблемаявляется то, что все мои реализации ISiteMapNodeVisibilityProvider используются глобально после этого кода.Если у меня есть локальный поставщик видимости с именем `` ABCVisibilityProvider`, он также будет использоваться глобально.Эта строка не работает должным образом:

.DependsOn(Dependency.OnComponentCollection(
    typeof(FilteredSiteMapNodeVisibilityProvider),
    typeof(TrimEmptyGroupingNodesVisibilityProvider),
    typeof(CustomVisibilityProvider))));

Не правильно ли я портировал код?

1 Ответ

0 голосов
/ 27 февраля 2019

Я не использовал правильный метод перегрузки для OnComponentCollection.Конструктор для CompositeSiteMapNodeVisibilityProvider имеет параметр с именем siteMapNodeVisibilityProviders.

.DependsOn(Dependency.OnComponentCollection(
    "siteMapNodeVisibilityProviders",
    typeof(FilteredSiteMapNodeVisibilityProvider),
    typeof(TrimEmptyGroupingNodesVisibilityProvider), 
    typeof(PropertyTypeGlobalNodeVisibilityProvider)))
...