代码之家  ›  专栏  ›  技术社区  ›  David Klempfner

设置构造函数注入时出现System.InvalidOperationException

  •  1
  • David Klempfner  · 技术社区  · 6 年前

    我正在尝试使用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方法 回报 是的。

    所以我很困惑 无效操作异常 被扔了。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jan Muncinsky    6 年前

    显然旧版本中有一个bug当用Resharper反编译时,我可以看到没有 IsGenericMethod 检查一下,但是:

      if (methodCallExpression != null && !(methodCallExpression.Method.GetGenericMethodDefinition().DeclaringType != typeof (IConstructorArgumentSyntax)))
        return;
    

    那么 GetGenericMethodDefinition() 会失败的,因为你的表情- ConfigurationManager.AppSettings["ProductsApiUrl"] 不是通用的。