2013-07-31 15 views
4

我正在试图解决一个类型时,出现以下错误:无法在类型长度相等1多个构造之间选择“System.String”

不能多个构造之间的长度相等1的类型选择“ System.String”。组件注册时,使用UsingConstructor()配置方法显式选择构造函数。

的类型有1个构造函数的IRepositoryILog所以我真的不知道是哪里的System.String即将到的画面。我很困惑。有谁知道问题是什么?

这里是堆栈跟踪:

在Autofac.Core.Activators.Reflection.MostParametersConstructorSelector.SelectConstructorBinding(ConstructorParameterBinding [] constructorBindings) 在Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext上下文,IEnumerable的1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable 1参数) 在Autofac.Core.Resolving.InstanceLookup.Execute() 在Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope,IComponentRegistration注册,IEnumerable的1 parameters) at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable 1参数) at Autofac.Core.Activators.Reflection.AutowiringParameter。 <> C_ DisplayClass2.b _0() 在Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate() 在Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext上下文,IEnumerable的1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable 1参数) 在Autofac.Core.Resolving.InstanceLookup.Execute() 在Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope,IComponentRegistration注册,IEnumerable的1 parameters) at Autofac.Core.Resolving.InstanceLookup.ResolveComponent(IComponentRegistration registration, IEnumerable 1参数) 在Autofac.Core.Activators.Reflection.AutowiringParameter。 <> C_ DisplayClass2.b _0() 在Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate() 在Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext上下文,IEnumerable的1 parameters) at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable 1参数) 在Autofac.Core.Resolving.InstanceLookup.Execute() 在Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope,IComponentRegistration注册,IEnumerable的1 parameters) at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(IComponentRegistration registration, IEnumerable 1参数) 在Autofac.Core.Resolving.ResolveOperation.Execute(IComponentRegistration注册,IEnumerable的1 parameters) at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(IComponentRegistration registration, IEnumerable 1参数) at Autofac.ResolutionExtensions.TryResolveService(IComponentContext c ontext,Service服务,IEnumerable的1 parameters, Object& instance) at Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable 1参数) 在Autofac.ResolutionExtensions.Resolve(IComponentContext背景下,类型的serviceType,IEnumerable的1 parameters) at Autofac.ResolutionExtensions.Resolve(IComponentContext context, Type serviceType) at SomeCompany.ComponentModel.Composition.AutofacIocContainer.Resolve(Type type) in c:\SomeCompany.Core\ComponentModel\Composition\AutofacIocContainer.cs:line 17 at SomeCompany.Commands.CommandFactory.Create(String name) in c:\SomeCompany.Core\Commands\CommandFactory.cs:line 28 at SomeCompany.Web.Controllers.CommandsController.Post(String id, String request) in c:\SomeCompany.Web\Controllers\CommandsController.cs:line 49 at lambda_method(Closure , Object , Object[]) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.<GetExecutor>b__c(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.<>c__DisplayClass5.<ExecuteAsync>b__4() at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func 1功能,的CancellationToken的CancellationToken)

+0

IRepository和ILog解决什么问题?实现这些接口的类的构造函数可能需要一个字符串参数,或者他们可以采用具有带字符串参数的构造函数的依赖项等。 –

+0

请显示您的配置和正在解析的类型的定义。难道它的一个依赖项('IRepository','ILog'或者它们的依赖关系是递归的)包含多个构造函数? Doensn't Autofac抛出一个类型名称(也许在内部异常)? – Steven

+2

你有没有想过这个? – ps2goat

回答

4

这有什么好做的多constuctors在自己的代码!

Autofac自动为您的主体的构造函数创建对象,当您没有明确地设置它们。

但是,当你的构造函数有一个String参数时,它不能创建一个字符串,因为String没有无参数的构造函数![1]

您需要明确设置主体的构造函数上的所有字符串。您也可以使用NamedParameters并为Strings提供一个明确的值。

祝你好运!

[1] http://msdn.microsoft.com/en-us/library/system.string%28v=vs.110%29.aspx

+6

这是一个正确的答案,但是如果你有一个相当复杂的容器来连接所有的依赖关系来查找带有字符串的依赖关系,那么从Autofac获得更多信息的调试信息会更好。 – Shaun

0

如果你有一个数据库定义文件(的.dbml),检查修改代码,你没有做。在我的情况下,下面的方法

public JudicialDataContext(string connectionString) : base(connectionString, mappingSource) 
{ 
    OnCreated(); 
} 

改成这样:

public JudicialDataContext(string connection) : base(connection, mappingSource) 
{ 
    OnCreated(); 
} 

我不知道为什么这样做,或者什么,努力实现由这样做,为什么这种变化甚至是必要的。但是放弃更改并重新编译会克服此错误。

相关问题