如何使用 Unity 将 FilteredSiteMapNodeVisibilityProvider 注入到 SiteMapNodeVisibilityProviderStrategy

How to inject FilteredSiteMapNodeVisibilityProvider to SiteMapNodeVisibilityProviderStrategy with Unity

我不知道如何使用 Unity 设置默认可见性提供程序。我使用了内部 DI 容器并且它可以工作,但是显示外部所有节点。

web.config

<add key="MvcSiteMapProvider_UseExternalDIContainer" value="true"/>

MvcSiteMapProviderContainerExtension

// Visibility Providers
this.Container.RegisterType<ISiteMapNodeVisibilityProvider, FilteredSiteMapNodeVisibilityProvider>("defaultProvider");
this.Container.RegisterType<ISiteMapNodeVisibilityProvider, TrimEmptyGroupingNodesVisibilityProvider>("trimVisibilityProvider");

this.Container.RegisterType<ISiteMapNodeVisibilityProviderStrategy, SiteMapNodeVisibilityProviderStrategy>(new InjectionConstructor(
    new ResolvedArrayParameter<ISiteMapNodeVisibilityProvider>(this.Container.ResolveAll<ISiteMapNodeVisibilityProvider>().ToArray()),
    new InjectionParameter<string>("defaultProvider")
    ));

根据 documentation, the default provider is resolved using the .NET type FullName string.

this.Container.RegisterType<ISiteMapNodeVisibilityProviderStrategy, SiteMapNodeVisibilityProviderStrategy>(new InjectionConstructor(
    new ResolvedArrayParameter<ISiteMapNodeVisibilityProvider>(this.Container.ResolveAll<ISiteMapNodeVisibilityProvider>().ToArray()),
    new InjectionParameter<string>("MvcSiteMapProvider.FilteredSiteMapNodeVisibilityProvider, MvcSiteMapProvider")
));

自动注册

请注意,ISiteMapNodeVisibilityProvider 的所有实现都会按照约定自动注册到您的 MVC 程序集中,因此无需添加以下行:

// Visibility Providers
this.Container.RegisterType<ISiteMapNodeVisibilityProvider, FilteredSiteMapNodeVisibilityProvider>("defaultProvider");
this.Container.RegisterType<ISiteMapNodeVisibilityProvider, TrimEmptyGroupingNodesVisibilityProvider>("trimVisibilityProvider");

这是Unity的自动注册码。如果您在另一个程序集中有 ISiteMapNodeVisibilityProvider 实现,您可以在此处添加该程序集名称。

var allAssemblies = new Assembly[] { currentAssembly, siteMapProviderAssembly };
var excludeTypes = new Type[] { 
    // Use this array to add types you wish to explicitly exclude from convention-based  
    // auto-registration. By default all types that either match I[TypeName] = [TypeName] or 
    // I[TypeName] = [TypeName]Adapter will be automatically wired up as long as they don't 
    // have the [ExcludeFromAutoRegistrationAttribute].
    //
    // If you want to override a type that follows the convention, you should add the name 
    // of either the implementation name or the interface that it inherits to this list and 
    // add your manual registration code below. This will prevent duplicate registrations 
    // of the types from occurring. 

    // Example:
    // typeof(SiteMap),
    // typeof(SiteMapNodeVisibilityProviderStrategy)
};
var multipleImplementationTypes = new Type[]  { 
    typeof(ISiteMapNodeUrlResolver), 
    typeof(ISiteMapNodeVisibilityProvider), // <- These are automatically registered by convention
    typeof(IDynamicNodeProvider) 
};

// ...

// Multiple implementations of strategy based extension points (and not decorated with [ExcludeFromAutoRegistrationAttribute]).
CommonConventions.RegisterAllImplementationsOfInterface(
    (interfaceType, implementationType) => this.Container.RegisterType(interfaceType, implementationType, implementationType.Name, new ContainerControlledLifetimeManager()),
    multipleImplementationTypes,
    allAssemblies,
    excludeTypes,
    string.Empty);