【问题标题】:Resolve type bound ToConstant with Ninject使用 Ninject 解析类型绑定 ToConstant
【发布时间】:2019-09-26 08:22:07
【问题描述】:

我在 Ninject 中使用“ToConstant”注册的构造函数中有一个带有 3 个参数的类。我想在不提供构造函数参数的情况下获取此实例,因为已绑定为单个实例。如果可以的话?

我明白,如果我将一个类型注册为单个实例,Ninject 不应该要求任何构造函数参数,因为没有什么要实例化的。

代码 sn-p 如下:

//create object
var singleInstance = new WhateverObject(param1, param2, param3);
//bind object ToConstant 
_kernel.Bind<WhateverObject>().ToConstant(singleInstance);
//resolve type
var instanceToRetrieve = _kernel.Get<WhateverObject>();   

上面的语句(resolve type) 崩溃是因为WhateverObject 没有无参数的构造函数并且ninject 需要param1、param2 和param3。关键是,如果对象注册为单个实例,为什么 Ninject 需要这些参数?我们如何请求 ninject 注册为单例的类型?

感谢您的贡献!

【问题讨论】:

    标签: ninject


    【解决方案1】:

    找到将类型绑定为常量(单例)的方法:

    public void BindToConstant<T1, T2>(Dictionary<string, object> arguments = null) where T2 : T1
            {
                if (!_kernel.GetBindings(typeof(T1)).Any())
                {
                    var constant = _kernel.Bind<T1>().To<T2>().InSingletonScope();
                    if (arguments != null && arguments.Count > 0)
                    {
                        arguments.ForEach(p =>
                        {
                            constant.WithConstructorArgument(p.Key, p.Value);
                        });
                    }
                }
            }
    

    其中 arguments 是一个字典,其中 key 是构造函数参数的名称, value 是参数的值,因此您可以使用灵活数量的参数调用此方法。

    希望对遇到同样问题的人有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多