2013-10-05 6 views
4

Мы используем CachedDataAnnotationsModelMetadataProvider как он improves performance, и мы используем много метаданных в нашем приложении MVC4.Как я могу расширить CachedDataAnnotationsModelMetadataProvider?

В настоящее время мы создаем пользовательский ModelMetadataProvider, наследующий от DataAnnotationsModelMetadataProvider и переопределяющий атрибут CreateMetadata, чтобы создать автоматическое отображение имен, например. удалить Идентификатор из имен и т. д. Однако мы также хотим его кэшировать, поэтому мы хотели создать наш пользовательский ModelMetadataProvider в CachedDataAnnotationsModelMetadataProvider.

Если мы попытаемся переопределить CreateMetadata, мы не сможем его запечатать. По какой-то причине он запечатан - я думаю, я могу получить источник и просто переопределить, только что показалось странным, что я не мог продлить?

Кто-нибудь сделал что-нибудь подобное?

ответ

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; 
     } 
} 
Смежные вопросы