如何扩展CachedDataAnnotationsModelMetadataProvider?

时间:2013-10-05 14:55:20

标签: asp.net asp.net-mvc asp.net-mvc-4 metadata modelmetadata

我们希望CachedDataAnnotationsModelMetadataProvider使用improves performance,我们在MVC4应用程序中使用了大量的元数据。

我们目前正在创建一个自定义ModelMetadataProvider,它继承自DataAnnotationsModelMetadataProvider并覆盖CreateMetadata属性以进行一些自动显示名称创建,例如从名称等中删除Id。但是我们也想要缓存它,因此我们希望将自定义ModelMetadataProvider建立在CachedDataAnnotationsModelMetadataProvider上。

如果我们试图覆盖CreateMetadata,我们就无法密封。任何原因它被密封 - 我想我可以得到源,只是重新实现只是发现它奇怪,我无法扩展?

有没有人做过类似的事情?

1 个答案:

答案 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;
      }
 }