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

标签 ninject

只是想弄清楚 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/

相关文章:

c# - 绑定(bind) ToConstant 和调用 InSingletonScope 是多余的吗?

c# - Ninject - 如何在范围内保存常量?

asp.net-mvc-3 - Controller Action 单元测试的模拟默认角色提供者

asp.net - Ninject 在 Web 服务中注入(inject)服务接口(interface)

asp.net-mvc-4 - SignalR、WebAPI 和 MVC 共享相同的依赖解析器内核

c# - Ninject:将父实例提供给正在解析的子实例

asp.net-mvc - ASP MVC 2 注入(inject)

c# - Hangfire 配置和 Ninject 配置

redis - ServiceStack 的 IRedisClientManager + Ninject - 使用 InSingletonScope?

dependency-injection - 使用 InRequestScope 与 Ninject 进行 Hangfire