.Resolve 和 .Get 之间的区别 Ninject

Difference between .Resolve and .Get in Ninject

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

Kernel.Get 个州的说明

gets an instance of the specified service by using the first binding that matches the specified constraints

Kernel.Resolve 个州的说明

Resolves instances for the specified request. The instances are not actually resolved until a consumer iterates over the enumeration.

在哪些情况下您可能会使用其中的任何一种? (目前我只使用 Get)

Kernel.GetResolutionExtensions.cs.

中的一种扩展方法(或更准确地说是一组扩展方法)

Kernel.ResolveIResolutionRoot.cs的一个方法,由IKernel实现。

只有通过阅读方法的描述,我们可以了解两件事:

  1. ResolutionExtensions.Get<T>(this IResolutionRoot root)只returns第一个匹配,在执行方法时解析。

  2. IResolutionRoot.Resolve(IRequest request)returns一个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();
}

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()