asp.net-mvc-4 – 如何实现自定义SiteMapNodeProvider
|
我正在尝试调整MvcSiteMapProvider以基于存储在数据库中的一些信息创建面包屑. this帖子的答案听起来很有希望所以我实现了自己的SiteMapNodeProvider.但后来我不知道如何连接,所以使用新实现的SiteMapNodeProvider而不是静态xml文件(“Mvc.sitemap”). 当我在我的项目中使用SimpleInjector时,我在已经存在的注入初始化代码中调用了setup方法. public static void Initialize()
{
Injection.Global = new Container();
InitializeContainer(Injection.Global);
Injection.Global.RegisterMvcControllers(Assembly.GetExecutingAssembly());
Injection.Global.RegisterMvcAttributeFilterProvider();
Injection.Global.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(Injection.Global));
}
private static void InitializeContainer(Container container)
{
// Setup configuration of DI
MvcSiteMapProviderContainerInitializer.SetUp(container);
//... register some other stuff for my project here ...
}
MvcSiteMapProviderContainerInitializer类由包创建:’Mvcsitemapprovider.mvc4.di.simpleinjector / 4.4.5′ 有谁知道如何让我的项目使用新创建的SiteMapNodeProvider? 编辑:我尝试了你的建议(甚至删除旧的DI东西,只使用了nuget-package中的那个),但我仍然得到错误… public static void SetUp(Container container)
{
bool securityTrimmingEnabled = false;
bool enableLocalization = true;
string absoluteFileName = HostingEnvironment.MapPath("~/Mvc.sitemap");
TimeSpan absoluteCacheExpiration = TimeSpan.FromMinutes(5);
string[] includeAssembliesForScan = new string[] { "testsitemap" };
// Extension to allow resolution of arrays by GetAllInstances (natively based on IEnumerable).
// source from: https://simpleinjector.codeplex.com/wikipage?title=CollectionRegistrationExtensions
AllowToResolveArraysAndLists(container);
var currentAssembly = typeof(MvcSiteMapProviderContainerInitializer).Assembly;
var siteMapProviderAssembly = typeof(SiteMaps).Assembly;
var allAssemblies = new Assembly[] { currentAssembly,siteMapProviderAssembly };
var excludeTypes = new Type[]
{
typeof (SiteMapNodeVisibilityProviderStrategy),typeof (SiteMapXmlReservedAttributeNameProvider),typeof (SiteMapBuilderSetStrategy),typeof (ControllerTypeResolverFactory),// Added 2013-06-28 by eric-b to avoid default singleton registration:
typeof(XmlSiteMapController),// Added 2013-06-28 by eric-b for SimpleInjector.Verify method:
typeof(PreservedRouteParameterCollection),typeof(MvcResolver),typeof(MvcSiteMapProvider.SiteMap),typeof(MetaRobotsValueCollection),typeof(RoleCollection),typeof(SiteMapPluginProvider),typeof(ControllerTypeResolver),typeof(RouteValueDictionary),typeof(AttributeDictionary),typeof(SiteMapNodeCreator)
};
var multipleImplementationTypes = new Type[]
{
typeof (ISiteMapNodeUrlResolver),typeof (ISiteMapNodeVisibilityProvider),typeof (IDynamicNodeProvider)
};
// Single implementations of interface with matching name (minus the "I").
CommonConventions.RegisterDefaultConventions(
(interfaceType,implementationType) => container.RegisterSingle(interfaceType,implementationType),new Assembly[] { siteMapProviderAssembly },allAssemblies,excludeTypes,string.Empty);
// Multiple implementations of strategy based extension points
CommonConventions.RegisterAllImplementationsOfInterfaceSingle(
(interfaceType,implementationTypes) => container.RegisterAll(interfaceType,implementationTypes),multipleImplementationTypes,new Type[0],"^Composite");
container.Register<XmlSiteMapController>();
// Visibility Providers
container.RegisterSingle<ISiteMapNodeVisibilityProviderStrategy>(() =>
new SiteMapNodeVisibilityProviderStrategy(
container.GetAllInstances
<ISiteMapNodeVisibilityProvider>().
ToArray(),string.Empty));
// Pass in the global controllerBuilder reference
container.RegisterSingle<ControllerBuilder>(() => ControllerBuilder.Current);
container.RegisterSingle<IControllerBuilder,ControllerBuilderAdaptor>();
container.RegisterSingle<IBuildManager,BuildManagerAdaptor>();
container.RegisterSingle<IControllerTypeResolverFactory>(() =>
new ControllerTypeResolverFactory(new string[0],container.GetInstance
<IControllerBuilder
>(),container.GetInstance
<IBuildManager>()));
// Configure Security
container.RegisterAll<IAclModule>(typeof(AuthorizeAttributeAclModule),typeof(XmlRolesAclModule));
container.RegisterSingle<IAclModule>(() => new CompositeAclModule(container.GetAllInstances<IAclModule>().ToArray()));
// Setup cache
container.RegisterSingle<System.Runtime.Caching.ObjectCache>(() => System.Runtime.Caching.MemoryCache.Default);
container.RegisterSingleOpenGeneric(typeof(ICacheProvider<>),typeof(RuntimeCacheProvider<>));
container.RegisterSingle<ICacheDependency>(() => new RuntimeFileCacheDependency(absoluteFileName));
container.RegisterSingle<ICacheDetails>(() => new CacheDetails(absoluteCacheExpiration,TimeSpan.MinValue,container.GetInstance<ICacheDependency>()));
// Configure the visitors
container.RegisterSingle<ISiteMapNodeVisitor,UrlResolvingSiteMapNodeVisitor>();
// Prepare for the sitemap node providers
container.RegisterSingle<ISiteMapXmlReservedAttributeNameProvider>(
() => new SiteMapXmlReservedAttributeNameProvider(new string[0]));
container.RegisterSingle<IXmlSource>(() => new FileXmlSource(absoluteFileName));
// Register the sitemap node providers
container.RegisterSingle<XmlSiteMapNodeProvider>(() => container.GetInstance<XmlSiteMapNodeProviderFactory>()
.Create(container.GetInstance<IXmlSource>()));
container.RegisterSingle<ReflectionSiteMapNodeProvider>(() => container.GetInstance<ReflectionSiteMapNodeProviderFactory>()
.Create(includeAssembliesForScan));
// Register your custom sitemap node provider
container.RegisterSingle<ISiteMapNodeProvider,CustomSiteMapNodeProvider>();
// Register the collection of sitemap node providers (including the custom one)
container.RegisterSingle<ISiteMapBuilder>(() => container.GetInstance<SiteMapBuilderFactory>()
.Create(new CompositeSiteMapNodeProvider(
container.GetInstance<XmlSiteMapNodeProvider>(),container.GetInstance<ReflectionSiteMapNodeProvider>(),container.GetInstance<CustomSiteMapNodeProvider>())));
container.RegisterAll<ISiteMapBuilderSet>(ResolveISiteMapBuilderSets(container,securityTrimmingEnabled,enableLocalization));
container.RegisterSingle<ISiteMapBuilderSetStrategy>(() => new SiteMapBuilderSetStrategy(container.GetAllInstances<ISiteMapBuilderSet>().ToArray()));
}
private static IEnumerable<ISiteMapBuilderSet> ResolveISiteMapBuilderSets(Container container,bool securityTrimmingEnabled,bool enableLocalization)
{
yield return new SiteMapBuilderSet(
"default",enableLocalization,container.GetInstance<ISiteMapBuilder>(),container.GetInstance<ICacheDetails>());
}
private static void AllowToResolveArraysAndLists(Container container)
{
container.ResolveUnregisteredType += (sender,e) =>
{
var serviceType = e.UnregisteredServiceType;
if (serviceType.IsArray)
{
RegisterArrayResolver(e,container,serviceType.GetElementType());
}
else if (serviceType.IsGenericType &&
serviceType.GetGenericTypeDefinition() == typeof(IList<>))
{
RegisterArrayResolver(e,serviceType.GetGenericArguments()[0]);
}
};
}
private static void RegisterArrayResolver(UnregisteredTypeEventArgs e,Container container,Type elementType)
{
var producer = container.GetRegistration(typeof(IEnumerable<>)
.MakeGenericType(elementType));
var enumerableExpression = producer.BuildExpression();
var arrayMethod = typeof(Enumerable).GetMethod("ToArray")
.MakeGenericMethod(elementType);
var arrayExpression = Expression.Call(arrayMethod,enumerableExpression);
e.Register(arrayExpression);
}
}
但我仍然得到以下异常:
|
- asp.net-mvc – 在RedirectToRoute和RedirectToAction的ASP
- asp.net-mvc – ASP.NET MVC从数据库加载Razor视图
- asp.net – 如何减缓黑客的速度
- 可以按需生成ASP.NET黄色死亡屏幕(YSOD)吗?
- asp.net – 使用Global.asax有什么优点和缺点?
- asp.net 大文件上传 之 改版了的SlickUpload.HttpUploadMod
- asp.net – 无法加载文件或程序集“System.Web.Mvc,Version
- asp.net-mvc – 什么时候应该在ASP.NET MVC中使用异步控制器
- asp.net-mvc-3 – 如何使用剃刀包括.html或.asp文件?
- 页面生成时间 – ASP.Net MVC
