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

use*_*613 2 ninject

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

Kernel.Get状态的描述

通过使用与指定约束匹配的第一个绑定来获取指定服务的实例

Kernel.Resolve状态的描述

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

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

Max*_*uez 10

Kernel.Get是一种生活的扩展方法(或一组更精确的扩展方法)ResolutionExtensions.cs.

Kernel.Resolve是一种方法IResolutionRoot.cs实现IKernel.

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

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

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


经过仔细检查, 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();
}
Run Code Online (Sandbox Code Playgroud)

并且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);
}
Run Code Online (Sandbox Code Playgroud)

这本质上是一个包装方法 IResolutionRoot.Resolve

所以ResolutionExtensions.Get<T>(this IResolutionRoot root)列举IResolutionRoot.Resolve使用Enumerable.Single.

结论

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

  • 感谢您的简明扼要解释. (2认同)