只是想弄清楚 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
实现.
仅通过阅读方法的描述,我们可以了解两件事:
ResolutionExtensions.Get<T>(this IResolutionRoot root)
只返回第一个匹配项,在执行方法时解析。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/