我在用
MvcSiteMapProvider.MVC5.DI.SimpleInjector.Modules 4.4.10 VS2013 MVC5,SimpleInjector 2.4.1
当调用容器上的“验证”时,我得到以下错误
附加信息:配置无效。为类型
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首席执行官是:
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
发布于 2014-02-06 19:31:21
外部DI配置文件的最新版本在升级时不会自动更新,如果您已经更改了它们。确保您已经从主分支合并了最新版本的CommonConventions.cs和MvcSiteMapProviderContainerInitializer.cs (这是手动完成的,但如果您使用diff工具快速查看更改,则会有很大帮助)。您还可以查看发布列表,查看对DI配置进行更新的各个点,并直接链接到GitHub上的diff。
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”时所做的。
https://stackoverflow.com/questions/21606494
复制相似问题