2013-10-05 3 views
4

CachedDataAnnotationsModelMetadataProviderimproves performance으로 사용하려고하며 우리는 MVC4 응용 프로그램에서 많은 메타 데이터를 사용합니다.어떻게 CachedDataAnnotationsModelMetadataProvider를 확장 할 수 있습니까?

현재 DataAnnotationsModelMetadataProvider에서 상속 받고 CreateMetadata 속성을 재정 의하여 사용자 지정 ModelMetadataProvider를 만들고 있습니다. 일부 자동 표시 이름 만들기를 수행합니다. 예 : 이름에서 ID를 제외합니다. 그러나 우리는 또한 캐싱하여 캐싱하기를 원하므로 사용자 정의 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; 
     } 
} 
관련 문제