【问题标题】:SimpleInjector MvcSitemapProviderSimpleInjector MvcSitemapProvider
【发布时间】:2014-02-06 15:06:03
【问题描述】:

我正在使用

VS2013 MVC5, 简单注射器 2.4.1 MvcSiteMapProvider.MVC5.DI.SimpleInjector.Modules 4.4.10

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

附加信息:配置无效。为类型 IAttributeAssemblyProvider 创建实例失败。 IAttributeAssemblyProvider 类型的注册委托引发了异常。 AttributeAssemblyProvider 类型的构造函数包含未注册的名称为“includeAssemblies”的IEnumerable<String> 类型参数。请确保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[] 生产者ToVerify)在 SimpleInjector.Container.VerifyIfAllExpressionsCanBeBuilt() 在 SimpleInjector.Container.Verify() 在 MyProject.App_Start.SimpleInjectorInitializer.Intialise() 在 \App_Start\SimpleInjectorInitializer.cs:第 54 行 \Global.asax.cs:line 中的 MyProject.MvcApplication.Application_Start() 16

【问题讨论】:

  • IAttributeAssemblyProvider 的注册是什么样的?
  • 我找不到 IAttributeAssemblyProvider 容器的显式注册,如果这就是你的意思的话。我刚刚从 MvcSitemapProvider Simpleinjector NuGet 中获取了默认代码。
  • 查看源代码中该软件包的作用。它可能正在注册。
  • 堆栈跟踪是什么?
  • 希望获得堆栈跟踪.. 同时,刚刚意识到 CommonConventions.RegisterDefaultConventions 不是您的,抱歉

标签: c# asp.net-mvc dependency-injection simple-injector mvcsitemapprovider


【解决方案1】:

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

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

当然,如果一切都失败了,您可以将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>())));

到这里……

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

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

【讨论】:

  • CommonConventions 中的字符串排除不起作用..但是将类型添加到排除的类型确实谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2014-11-03
  • 2014-03-21
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多