如何使用 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);
我不知道如何使用 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);