4

我们希望使用CachedDataAnnotationsModelMetadataProvider来提高性能,并且我们在 MVC4 应用程序中使用了大量元数据。

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

如果我们试图覆盖CreateMetadata我们不能,因为它是密封的。它被密封的任何原因 - 我想我可以获得源代码并重新实现只是发现我无法扩展很奇怪?

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

4

1 回答 1

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;
      }
 }
于 2014-01-07T22:46:11.647 回答