2012-12-02 5 views
0

WPF-PRISM-MVVM을 사용하여 리치 클라이언트 애플리케이션을 개발 중입니다.
클라이언트는 CRUD 기능을 제공하고 WCF 채널을 통해 도메인 엔터티에 대한 변경 내용을 게시하는 리포지토리 서비스와 상호 작용합니다.
클라이언트는 성능을 향상시키고 오프라인 기능을 제공하기 위해 도메인 엔터티 캐시를 처리합니다.
그 목적을 위해 나는 클라이언트 측에서 살아있는 저장소 에이전트 서비스를 작성하고 저장소 서비스를 랩핑하고 캐싱을 처리하고 도메인 엔티티 변경 사항에 관심이있는 관련 클라이언트 측 구성 요소로 전파를 변경합니다.리치 클라이언트 데이터 처리 및 캐싱 패턴

오랜 소개 후 내 질문에 어떻게 할 수 있습니까?
알고 있어야하는 클라이언트 측 데이터 처리 및 캐싱 패턴이 있습니까?

우리의 측면은 다음과 같습니다

건배,
도론

답변

0

우리는 우리의 클라이언트 측 캐싱 PostSharp의 형태로 AOP 사용, 우리는 단순히 캐시 방법 및 비올라에 속성을 추가 - 실제 캐시 구현을 ICacheService의 인스턴스로 연기하지만 아이디어를 얻습니다.

[Serializable] 
[MulticastAttributeUsage(MulticastTargets.Method, PersistMetaData = true)] 
public class MethodCacheAttribute : MethodInterceptionAspect 
{ 

    public const int DefaultCacheSeconds = 600; 
    private ICacheService CacheService { get; set; } 
    private string methodName; 

    [IntroduceMember(Visibility = PostSharp.Reflection.Visibility.Family, OverrideAction = MemberOverrideAction.Ignore, IsVirtual = true)] 
    public double CacheForSeconds { get; set; } 


    public MethodCacheAttribute() : this(DefaultCacheSeconds) { } 
    public MethodCacheAttribute(int seconds) 
    { 
     this.CacheForSeconds = seconds; 
    } 

    public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo) 
    { 
     this.methodName = method.Name; 
    } 

    public sealed override void OnInvoke(MethodInterceptionArgs args) 
    { 
     var key = this.BuildCacheKey(args.Arguments,args.Method); 

     var item = ServiceLocator.Current.GetInstance<ICacheService>().Cache<object>(key,() => 
      { 
       return args.Invoke(args.Arguments); 
      },CacheForSeconds ==0 ? TimeSpan.MaxValue : TimeSpan.FromSeconds(CacheForSeconds)); 
      args.ReturnValue = item; 
    } 


    private string BuildCacheKey(Arguments arguments, MethodBase method) 
    { 
     var sb = new StringBuilder(); 
     sb.Append(this.methodName); 

     foreach (var argument in arguments.ToArray()) 
     { 
      sb.Append(argument == null ? "_" : argument.GetHashCode().ToString()); 
     } 

     if (method.IsGenericMethod) 
     { 
      var genericArgs = String.Join("-", method.GetGenericArguments().Select(t => t.Name)); 
      sb.Append(genericArgs); 
     } 

     return sb.ToString(); 
    } 
} 
0

Decorator Pattern의 다소 고전적인 응용 프로그램은 캐싱 기능을 추가하는 것입니다. 기본적으로 실제 구성 요소 구현을 특정 유형의 요청을 캐시하여 성능을 향상시키는 다른 구성 요소로 래핑합니다. 이것은 IMO 간단하고 매우 우아한 접근 방식입니다.

Component myComponent = new ScientificCalculator(); 
    Component myDecorator = new ComponentDecorator(myComponent); 
    // expensive 
    double result = myComponent.doExpensiveComputation(); 

    // use the Decorator and cache the first time 
    result = myDecorator.doExpensiveComputation(); 
    // and now is cheap 
    result = myDecorator.doExpensiveComputation(); 
+0

감사합니다. 이것은 내가 현재 사용하고있는 전략이다. 나는 다른 대안이 있는지보기 위해보고있었습니다. – DoronBM