C# SimpleInjector MvcSitemapProvider

C# SimpleInjector MvcSitemapProvider,c#,asp.net-mvc,dependency-injection,simple-injector,mvcsitemapprovider,C#,Asp.net Mvc,Dependency Injection,Simple Injector,Mvcsitemapprovider,我正在使用 VS2013 MVC5, SimpleInjector 2.4.1 MvcSiteMapProvider.MVC5.DI.SimpleInjector.Modules 4.4.10 在容器上调用“Verify”时出现以下错误 其他信息:配置无效。为类型IAttributeAssemblyProvider创建实例失败。类型为IAttributeAssemblyProvider的注册委托引发了异常。类型AttributeAssemblyProvider的构造函数包含名为“includeA

我正在使用

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

在容器上调用“Verify”时出现以下错误

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

它引用的数组是:

string[] includeAssembliesForScan = new string[] { "MyProject" };
这似乎是罪魁祸首:

        container.RegisterSingle<ReflectionSiteMapNodeProvider>(() => 
            container.GetInstance<ReflectionSiteMapNodeProviderFactory>()
            .Create(includeAssembliesForScan));
自:

  public class AttributeAssemblyProvider  : IAttributeAssemblyProvider
选举主任是:

public AttributeAssemblyProvider(
            IEnumerable<string> includeAssemblies,
            IEnumerable<string> excludeAssemblies)
        {...}
公共属性SemblyProvider(
i数不清的包括组件,
IEnumerable(不包括组件)
{...}
提前谢谢你的帮助

堆栈跟踪是:

位于SimpleInjector.InstanceProducer.VerifyExpressionBuilding()处 SimpleInjector.Container.VerifyIfalleExpressionsCanbebuild(InstanceProducer[] 生产商(验证)在 SimpleInjector.Container.VerifyIfalleExpressionsCanbeBuild()位于 SimpleInjector.Container.Verify()位于 MyProject.App_Start.SimpleInjectorInitializer.Intialize()中的 \App\u Start\SimpleInjectorInitializer.cs:第54行 \Global.asax.cs:line中的MyProject.mvcapapplication.Application_Start() 十六,


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

CommonConventions.RegisterDefaultConventions的最新版本不包括在构造函数中具有字符串参数的任何类型的自动注册(AttributeAsemblyProvider有此功能),因此请确保已将该文件的最新更改合并到项目中

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

此外,如果您没有使用MvcSiteMapNodeAttribute来注册节点,则根本不需要在配置中使用它。删除它将使您的站点地图加载速度加快一点

要删除它,请更改此

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>())));
container.RegisterSingle(()=>container.GetInstance()
.创建(包括用于扫描的装配);
//注册站点地图生成器
container.RegisterSingle(()=>container.GetInstance()
.Create(新建CompositeSiteMapNodeProvider(container.GetInstance(),container.GetInstance());
对此

// Register the sitemap builders
container.RegisterSingle<ISiteMapBuilder>(() => container.GetInstance<SiteMapBuilderFactory>()
    .Create(container.GetInstance<XmlSiteMapNodeProvider>()));
//注册站点地图生成器
container.RegisterSingle(()=>container.GetInstance()
.Create(container.GetInstance());

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

IATributteAssemblyProvider的注册是什么样子的?我找不到IATributteAssemblyProvider容器的明确注册,如果这是您的意思的话。我刚刚从MvcSitemapProvider Simpleinjector NuGet中获取了默认代码。请查看源代码,看看该包在做什么。它可能正在进行注册。堆栈跟踪是什么?正在查找堆栈跟踪。。同时,刚刚意识到CommonConventions.RegisterDefaultConventions不是您的,抱歉CommonConventions中的字符串排除不起作用。但是将类型添加到排除的类型中确实起到了作用
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>())));
// Register the sitemap builders
container.RegisterSingle<ISiteMapBuilder>(() => container.GetInstance<SiteMapBuilderFactory>()
    .Create(container.GetInstance<XmlSiteMapNodeProvider>()));