只是想对ninject中Kernel.Resolve和Kernel.Get之间的区别做一些澄清。
Kernel.Get状态的描述
使用匹配指定约束的第一个绑定
获取指定服务的实例
Kernel.Resolve状态的描述
解析指定请求的实例。在消费者迭代枚举之前,实例并未实际解析。
您可以在哪些情况下使用其中任何一种? (现在我只使用Get)
答案 0 :(得分:9)
Kernel.Get
是一种扩展方法(或一组更精确的扩展方法),它们位于ResolutionExtensions.cs
。
Kernel.Resolve
是由IKernel
实施的IResolutionRoot.cs
方法。
只有通过阅读方法的描述,我们才能重新审视两件事:
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();
}
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()