Ninject中.Resolve和.Get之间的区别

时间:2017-03-20 15:18:17

标签: ninject

只是想对ninject中Kernel.Resolve和Kernel.Get之间的区别做一些澄清。

Kernel.Get状态的描述

  

使用匹配指定约束的第一个绑定

获取指定服务的实例

Kernel.Resolve状态的描述

  

解析指定请求的实例。在消费者迭代枚举之前,实例并未实际解析。

您可以在哪些情况下使用其中任何一种? (现在我只使用Get)

1 个答案:

答案 0 :(得分:9)

Kernel.Get是一种扩展方法(或一组更精确的扩展方法),它们位于ResolutionExtensions.cs

Kernel.Resolve是由IKernel实施的IResolutionRoot.cs方法。

只有通过阅读方法的描述,我们才能重新审视两件事:

  1. ResolutionExtensions.Get<T>(this IResolutionRoot root)仅返回第一个匹配项,该方法在执行方法时解析。

  2. IResolutionRoot.Resolve(IRequest request)返回IEnumerable<T>,此枚举只会在枚举时解析每个匹配项,并且可以有多个匹配项。

  3. 经过仔细检查,ResolutionExtensions.Get<T>(this IResolutionRoot root)的实施是:

    public static T Get<T>(this IResolutionRoot root, params IParameter[] parameters)
    {
        return GetResolutionIterator(root, typeof(T), null, parameters, false, true).Cast<T>().Single();
    }
    

    GetResolutionIterator的实施是

    private static IEnumerable<object> GetResolutionIterator(IResolutionRoot root, Type service, Func<IBindingMetadata, bool> constraint, IEnumerable<IParameter> parameters, bool isOptional, bool isUnique)
    {
        Ensure.ArgumentNotNull(root, "root");
        Ensure.ArgumentNotNull(service, "service");
        Ensure.ArgumentNotNull(parameters, "parameters");
    
        IRequest request = root.CreateRequest(service, constraint, parameters, isOptional, isUnique);
        return root.Resolve(request);
    }
    

    本质上是IResolutionRoot.Resolve

    的包装方法

    因此ResolutionExtensions.Get<T>(this IResolutionRoot root)使用Enumerable.Single枚举IResolutionRoot.Resolve

    结论

    Kernel.Get() == Kernel.Resolve().Single()