繁体   English   中英

富客户端数据处理和缓存模式

[英]rich client data handling and caching patterns

我正在使用WPF-PRISM-MVVM开发富客户端应用程序。
客户端与提供CRUD功能的存储库服务交互,并通过WCF通道发布域实体的所有更改。
客户端处理域实体缓存,以提高性能并提供脱机功能。
为此,我编写了一个存储库代理服务,该服务位于客户端,并包装该存储库服务并处理缓存和更改传播到对域实体更改感兴趣的相关客户端组件。

经过长时间的介绍,我的问题是这样吗?
我应该注意任何客户端数据处理和缓存模式吗?

干杯,
多伦

我们以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();
    }
}

装饰器模式的一个相当经典的应用是添加缓存功能。 您基本上将实际的组件实现与另一个缓存某些类型的请求的实现包装在一起,从而提高了性能。 这是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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM