我正在尝试使用Ninject注入构造函数参数:
private void AddBindings()
{
//_kernel.Bind<IRestClient>().ToConstructor(x => new RestClient("http://localhost:49780/api/ProductApi"));
_kernel.Bind<IRestClient>().ToConstructor(x => new RestClient(ConfigurationManager.AppSettings["ProductsApiUrl"]));
}
但是我得到了以下信息
System.InvalidOperationException
由于对象的当前状态,操作无效。
当我使用注释掉的行时,它工作得很好。
我已在调试模式中检查
ConfigurationManager.AppSettings["ProductsApiUrl"]
等于
"http://localhost:49780/api/ProductApi"
是的。
为什么引发此异常?
这是
StackTrace
以下内容:
at System.Reflection.RuntimeMethodInfo.GetGenericMethodDefinition()
at Ninject.Planning.Bindings.BindingBuilder.AddConstructorArgument(Expression argument, String argumentName, ParameterExpression constructorArgumentSyntaxParameterExpression)
at Ninject.Planning.Bindings.BindingBuilder.AddConstructorArguments(NewExpression ctorExpression, ParameterExpression constructorArgumentSyntaxParameterExpression)
at Ninject.Planning.Bindings.BindingBuilder.InternalToConstructor[TImplementation](Expression`1 newExpression)
at Ninject.Planning.Bindings.BindingBuilder`1.ToConstructor[TImplementation](Expression`1 newExpression)
at ShoppingCart.Infrastructure.NinjectDependencyResolver.AddBindings() in C:\Users\user1\Documents\ShoppingCart\ShoppingCart\Infrastructure\NinjectDependencyResolver.cs:line 35
at ShoppingCart.Infrastructure.NinjectDependencyResolver..ctor(IKernel kernelParam) in C:\Users\user1\Documents\ShoppingCart\ShoppingCart\Infrastructure\NinjectDependencyResolver.cs:line 20
at ShoppingCart.App_Start.NinjectWebCommon.RegisterServices(IKernel kernel) in C:\Users\user1\Documents\ShoppingCart\ShoppingCart\App_Start\NinjectWebCommon.cs:line 56
at ShoppingCart.App_Start.NinjectWebCommon.CreateKernel() in C:\Users\user1\Documents\ShoppingCart\ShoppingCart\App_Start\NinjectWebCommon.cs:line 46
at Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback)
at ShoppingCart.App_Start.NinjectWebCommon.Start() in C:\Users\user1\Documents\ShoppingCart\ShoppingCart\App_Start\NinjectWebCommon.cs:line 25
编辑:
我刚刚意识到如果我这样做的话效果会很好:
string productsApiUrl = ConfigurationManager.AppSettings["ProductsApiUrl"];
_kernel.Bind<IRestClient>().ToConstructor(x => new RestClient(productsApiUrl));
为什么在什么时候
ConfigurationManager.AppSettings[“产品SAPIURL”]
是否被评估?
我看了一眼
AddConstructorArgument()
在
GitHub
.
它具有以下if语句:
if (!(argument is MethodCallExpression methodCall) ||
!methodCall.Method.IsGenericMethod ||
methodCall.Method.GetGenericMethodDefinition().DeclaringType != typeof(IConstructorArgumentSyntax))
它在召唤
GetGenericMethodDefinition()
意思是
!methodCall.Method.IsGenericMethod
是
false
,即。
IsGenericMethod
回报
true
.
但是根据
MSDN
InvalidOperationException
只有当
IsGenericMethod方法
回报
假
是的。
所以我很困惑
无效操作异常
被扔了。