0

WPF-PRISM-MVVMを使用してリッチクライアントアプリケーションを開発しています。
クライアントは、CRUD機能を提供し、WCFチャネルを介してドメインエンティティの変更を公開するリポジトリサービスと対話します。
クライアントは、パフォーマンスを向上させ、オフライン機能を提供するために、ドメインエンティティのキ​​ャッシュを処理します。
その目的のために、クライアント側に存在し、リポジトリサービスをラップし、ドメインエンティティの変更に関心を持つ関連するクライアント側コンポーネントへのキャッシュと変更の伝播を処理するリポジトリエージェントサービスを作成しました。

長い紹介の後、私の質問はこれがそれを行う方法ですか?
知っておくべきクライアント側のデータ処理とキャッシュパターンはありますか?

乾杯、
ドロン

4

2 に答える 2

0

Decorator パターンのかなり古典的なアプリケーションは、キャッシュ機能を追加することです。基本的に、実際のコンポーネントの実装を、特定のタイプのリクエストをキャッシュする別の実装でラップして、パフォーマンスを向上させます。これは 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();
于 2012-12-05T16:00:21.277 に答える
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();
    }
}
于 2012-12-05T10:25:50.870 に答える