我正在使用
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
答案 0 :(得分:2)
如果您更改了外部DI配置文件的最新版本,则在升级时不会自动更新。确保您已从主分支合并到CommonConventions.cs和MvcSiteMapProviderContainerInitializer.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”时的作用。