SimpleInjector MvcSitemapProvider

时间:2014-02-06 15:06:04

标签: 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的构造函数包含类型为IEnumerable<String>的参数,其名称为“includeAssemblies”,未注册。请确保在容器中注册IEnumerable<String>,或更改AttributeAssemblyProvider的构造函数。

它引用的数组是:

string[] includeAssembliesForScan = new string[] { "MyProject" };

这似乎是罪魁祸首:

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

create方法的签名是:

public MvcSiteMapProvider.Builder.ReflectionSiteMapNodeProvider Create(System.Collections.Generic.IEnumerable<string> includeAssemblies)
    Member of MvcSiteMapProvider.Builder.ReflectionSiteMapNodeProviderFactory

我认为IAttributeAssemblyProvider正在按照以下注册

// 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);

因为:

  public class AttributeAssemblyProvider  : IAttributeAssemblyProvider

并且ctor是:

public AttributeAssemblyProvider(
            IEnumerable<string> includeAssemblies,
            IEnumerable<string> excludeAssemblies)
        {...}

提前感谢您提供任何帮助

堆栈跟踪是:

  

在SimpleInjector.InstanceProducer.VerifyExpressionBuilding()中   SimpleInjector.Container.VerifyIfAllExpressionsCanBeBuilt(InstanceProducer []   producerToVerify)at   SimpleInjector.Container.VerifyIfAllExpressionsCanBeBuilt()at   SimpleInjector.Container.Verify()at   MyProject.App_Start.SimpleInjectorInitializer.Intialise()in   \ App_Start \ SimpleInjectorInitializer.cs:第54行at   \ Global.asax.cs中的MyProject.MvcApplication.Application_Start():行   16

1 个答案:

答案 0 :(得分:2)

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

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

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

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

要删除它,请更改此...

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>()));

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