我们希望CachedDataAnnotationsModelMetadataProvider
使用improves performance,我们在MVC4应用程序中使用了大量的元数据。
我们目前正在创建一个自定义ModelMetadataProvider,它继承自DataAnnotationsModelMetadataProvider并覆盖CreateMetadata
属性以进行一些自动显示名称创建,例如从名称等中删除Id。但是我们也想要缓存它,因此我们希望将自定义ModelMetadataProvider建立在CachedDataAnnotationsModelMetadataProvider上。
如果我们试图覆盖CreateMetadata
,我们就无法密封。任何原因它被密封 - 我想我可以得到源,只是重新实现只是发现它奇怪,我无法扩展?
有没有人做过类似的事情?
答案 0 :(得分:3)
我猜它被密封的原因是因为实际的CreateMetadata
实现包含你不应该修改的缓存逻辑。
为了扩展CachedDataAnnotationsModelMetadataProvider
,我发现以下似乎效果很好:
using System.Web.Mvc;
public class MyCustomMetadataProvider : CachedDataAnnotationsModelMetadataProvider
{
protected override CachedDataAnnotationsModelMetadata CreateMetadataFromPrototype(CachedDataAnnotationsModelMetadata prototype, Func<object> modelAccessor)
{
var result = base.CreateMetadataFromPrototype(prototype, modelAccessor);
//modify the base result with your custom logic, typically adding items from
//prototype.AdditionalValues, e.g.
result.AdditionalValues.Add("MyCustomValuesKey", prototype.AdditionalValues["MyCustomValuesKey"]);
return result;
}
protected override CachedDataAnnotationsModelMetadata CreateMetadataPrototype(IEnumerable<Attribute> attributes, Type containerType, Type modelType, string propertyName)
{
CachedDataAnnotationsModelMetadata prototype = base.CreateMetadataPrototype(attributes, containerType, modelType, propertyName);
//Add custom prototype data, e.g.
prototype.AdditionalValues.Add("MyCustomValuesKey", "MyCustomValuesData");
return prototype;
}
}