gpt4 book ai didi

ninject - Ninject 中 .Resolve 和 .Get 的区别

转载 作者:行者123 更新时间:2023-12-02 06:14:22 27 4
gpt4 key购买 nike

只是想弄清楚 Kernel.Resolve 和 Kernel.Get 在 ninject 之间的区别。

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.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();
}

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)正在枚举 IResolutionRoot.Resolve使用 Enumerable.Single .

结论

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

关于ninject - Ninject 中 .Resolve 和 .Get 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42907360/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com