只是想对ninject中Kernel.Resolve和Kernel.Get之间的区别做一些澄清.
Kernel.Get状态的描述
通过使用与指定约束匹配的第一个绑定来获取指定服务的实例
Kernel.Resolve状态的描述
解析指定请求的实例.在消费者迭代枚举之前,实际上并未解析实例.
您可以在哪些情况下使用其中任何一种?(现在我正在使用Get)
Max*_*uez 10
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();
}
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
这本质上是一个包装方法 IResolutionRoot.Resolve
所以ResolutionExtensions.Get<T>(this IResolutionRoot root)列举IResolutionRoot.Resolve使用Enumerable.Single.
Kernel.Get() == Kernel.Resolve().Single()
| 归档时间: |
|
| 查看次数: |
1272 次 |
| 最近记录: |