首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SimpleInjector MvcSitemapProvider

SimpleInjector MvcSitemapProvider
EN

Stack Overflow用户
提问于 2014-02-06 15:06:03
回答 1查看 587关注 0票数 0

我在用

MvcSiteMapProvider.MVC5.DI.SimpleInjector.Modules 4.4.10 VS2013 MVC5,SimpleInjector 2.4.1

当调用容器上的“验证”时,我得到以下错误

附加信息:配置无效。为类型IAttributeAssemblyProvider创建实例失败。类型IAttributeAssemblyProvider的注册委托引发了一个异常。类型AttributeAssemblyProvider的构造函数包含未注册名称“includeAssemblies”的类型IEnumerable<String>的参数。请确保IEnumerable<String>已在容器中注册,或更改AttributeAssemblyProvider的构造函数。

它所引用的数组是:

代码语言:javascript
复制
string[] includeAssembliesForScan = new string[] { "MyProject" };

这似乎就是罪魁祸首:

代码语言:javascript
复制
        container.RegisterSingle<ReflectionSiteMapNodeProvider>(() => 
            container.GetInstance<ReflectionSiteMapNodeProviderFactory>()
            .Create(includeAssembliesForScan));

create方法的签名是:

代码语言:javascript
复制
public MvcSiteMapProvider.Builder.ReflectionSiteMapNodeProvider Create(System.Collections.Generic.IEnumerable<string> includeAssemblies)
    Member of MvcSiteMapProvider.Builder.ReflectionSiteMapNodeProviderFactory

我认为IAttributeAssemblyProvider是按以下方式注册的

代码语言:javascript
复制
// 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);

因为:

代码语言:javascript
复制
  public class AttributeAssemblyProvider  : IAttributeAssemblyProvider

首席执行官是:

代码语言:javascript
复制
public AttributeAssemblyProvider(
            IEnumerable<string> includeAssemblies,
            IEnumerable<string> excludeAssemblies)
        {...}

提前感谢您的帮助

堆栈跟踪是:

在SimpleInjector.InstanceProducer.VerifyExpressionBuilding() at SimpleInjector.Container.VerifyIfAllExpressionsCanBeBuilt(InstanceProducer[] producersToVerify)在SimpleInjector.Container.VerifyIfAllExpressionsCanBeBuilt() at SimpleInjector.Container.Verify() at MyProject.App_Start.SimpleInjectorInitializer.Intialise() in \App_Start\SimpleInjectorInitializer.cs:line 54 at MyProject.MvcApplication.Application_Start() in \Global.asax.cs:line 16

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-06 19:31:21

外部DI配置文件的最新版本在升级时不会自动更新,如果您已经更改了它们。确保您已经从主分支合并了最新版本的CommonConventions.csMvcSiteMapProviderContainerInitializer.cs (这是手动完成的,但如果您使用diff工具快速查看更改,则会有很大帮助)。您还可以查看发布列表,查看对DI配置进行更新的各个点,并直接链接到GitHub上的diff。

CommonConventions.RegisterDefaultConventions的最新版本排除了在构造函数中具有字符串参数的任何类型的自动注册( AttributeAssemblyProvider会这样做),因此请确保您已经将该文件的最新更改合并到您的项目中。

当然,如果所有这些都失败了,您可以将typeof(AttributeAssemblyProvider)添加到excludeTypes数组中,并且它将不再自动注册。不应该是因为它有一个工厂类来实例化它,名为AttributeAssemblyProviderFactory。

另外,如果您没有使用MvcSiteMapNodeAttribute注册节点,则完全没有必要在配置中使用它。删除它将使您的SiteMap加载速度更快一些。

要移除它,改变这个..。

代码语言:javascript
复制
container.RegisterSingle<ReflectionSiteMapNodeProvider>(() => container.GetInstance<ReflectionSiteMapNodeProviderFactory>()
    .Create(includeAssembliesForScan));

// Register the sitemap builders
container.RegisterSingle<ISiteMapBuilder>(() => container.GetInstance<SiteMapBuilderFactory>()
    .Create(new CompositeSiteMapNodeProvider(container.GetInstance<XmlSiteMapNodeProvider>(), container.GetInstance<ReflectionSiteMapNodeProvider>())));

为了这个..。

代码语言:javascript
复制
// Register the sitemap builders
container.RegisterSingle<ISiteMapBuilder>(() => container.GetInstance<SiteMapBuilderFactory>()
    .Create(container.GetInstance<XmlSiteMapNodeProvider>()));

当您使用内部DI容器时,这正是"MvcSiteMapProvider_ScanAssembliesForSiteMapNodes“web.config设置设置为"false”时所做的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21606494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档