.Resolve 和 .Get 之间的区别 Ninject
Difference between .Resolve and .Get in Ninject
只是想澄清一下 ninject 中 Kernel.Resolve 和 Kernel.Get 之间的区别。
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)
只returns第一个匹配,在执行方法时解析。
IResolutionRoot.Resolve(IRequest request)
returns一个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()
只是想澄清一下 ninject 中 Kernel.Resolve 和 Kernel.Get 之间的区别。
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)
只returns第一个匹配,在执行方法时解析。IResolutionRoot.Resolve(IRequest request)
returns一个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()