这两个属性之间有什么区别?
我可以使用def reset(self):
self.curr_idx = 0
self.nd_text = []
self.nd_img = []
self.ndlabel = []
for buck in self.data:
label = self.answer # self.answer, self.img are get from npy file
self.nd_text.append(mx.ndarray.array(buck, dtype=self.dtype))
self.nd_img.append(mx.ndarray.array(self.img, dtype=self.dtype))
self.ndlabel.append(mx.ndarray.array(label, dtype=self.dtype))
代替HttpContext.Items
在HttpContext.Features
之间共享数据。我看到的唯一区别是,我告诉middlewares
输入密钥,它给了我对象,因此我必须强制转换它。可以自动在Items
中进行投射。
他们身后还有其他东西吗?
答案 0 :(得分:2)
最大的区别是HttpContext.Items
设计为存储Key-Value-Pair
,而HttpContext.Features
设计为存储Type-Instance-Pair
。
更清楚地说,HttpContext.Items
旨在共享当前请求范围内的项目,而HttpContext.Features
是IFeatureCollection
的实例,决不是那样用。
IFeatureCollection
接口表示HTTP功能的集合,例如:
IAuthenticationFeature
,用于存储原始PathBase和原始Path。ISessionFeature
,用于存储当前会话。IHttpConnectionFeature
,用于存储基础连接。为帮助存储和检索Type-Instance-Pair
,该界面具有三种重要方法:
public interface IFeatureCollection : IEnumerable<KeyValuePair<Type, object>>{
// ...
object this[Type key] { get; set; }
TFeature Get<TFeature>();
void Set<TFeature>(TFeature instance);
}
和实现(FeatureCollection
)会将值简单地转换为所需的类型:
public class FeatureCollection : IFeatureCollection
{
// ... get the required type of feature
public TFeature Get<TFeature>()
{
return (TFeature)this[typeof(TFeature)]; // note: cast here!
}
public void Set<TFeature>(TFeature instance)
{
this[typeof(TFeature)] = instance; // note!
}
}
这是设计使然。因为不需要存储两个IHttpConnectionFeature
实例或两个ISession
实例。
虽然您可以用Type-Value
存储一些FeatureCollection
对,但最好不要。如您所见,如果集合中已经存在某种类型,则Set<TFeature>(TFeature instance)
会简单地替换旧的类型。如果您有两个相同的类型,这也意味着会出现错误。
答案 1 :(得分:1)
HttpContext.Items
旨在共享短暂的每个请求数据。
HttpContext.Features
旨在共享各种HTTP功能,这些功能允许中间件创建或修改应用程序的托管管道。它已经来自.NET filled with several features,例如IHttpSendFileFeature
。
您应该使用HttpContext.Items
存储数据,并使用HttpContext.Features
添加其他中间件类可能需要的所有新HTTP功能。