2011-06-10 11 views
3

Castle DynamicProxyから始めて、このサンプルを使ってオブジェクトのプロパティの変更を追跡しています。.NETのweb-appsでCastle DynamicProxyを使用するためのパフォーマンスに関するアドバイス

質問:

  • は私がAsTrackableに使用ProxyGenerator()インスタンス()(静的フィールドで)をキャッシュすべきか?私はASP.NET Webアプリケーションで使用するつもりですが、クラスがスレッドセーフであるかどうかはわかりませんでしたか?作成するのは費用がかかりますか?
  • コードをそのまま残すと、生成されたプロキシタイプが別のProxyGeneratorインスタンスによって再利用されますか?私はcaching tutorialを読んでいますが、「モジュールスコープ」が何を意味するのかはわかりません。
  • コードを改善するためのパフォーマンス上のアドバイスはありますか?

コード:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var p = new Person { Name = "Jay" }.AsTrackable(); 

     //here's changed properties list should be empty. 
     var changedProperties = p.GetChangedProperties(); 

     p.Name = "May"; 

     //here's changed properties list should have one item. 
     changedProperties = p.GetChangedProperties(); 
    } 
} 

public static class Ext 
{ 
    public static T AsTrackable<T>(this T instance) where T : class 
    { 
     return new ProxyGenerator().CreateClassProxyWithTarget 
     (
      instance, 
      new PropertyChangeTrackingInterceptor() 
     ); 
    } 

    public static HashSet<string> GetChangedProperties<T>(this T instance) 
    where T : class 
    { 
     var proxy = instance as IProxyTargetAccessor; 

     if (proxy != null) 
     { 
      var interceptor = proxy.GetInterceptors() 
            .Select(i => i as IChangedProperties) 
            .First(); 

      if (interceptor != null) 
      { 
       return interceptor.Properties; 
      } 
     } 

     return new HashSet<string>(); 
    } 
} 

interface IChangedProperties 
{ 
    HashSet<string> Properties { get; } 
} 

public class PropertyChangeTrackingInterceptor : IInterceptor, IChangedProperties 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     invocation.Proceed(); 

     this.Properties.Add(invocation.Method.Name); 
    } 

    private HashSet<string> properties = new HashSet<string>(); 

    public HashSet<string> Properties 
    { 
     get { return this.properties; } 
     private set { this.properties = value; } 
    } 
} 

public class Person 
{ 
    public virtual string Name { get; set; } 
    public virtual int Age { get; set; } 
} 

}

答えて

4

それはあなたのプロキシジェネレータの静的なコピーをキャッシュするために、あなたは絶対にこれを行う必要があり、スレッドセーフです。これはこのAPIのベストプラクティスと見なされます。そうしないと、新しいダイナミックアセンブリで特別な型が何の理由もなく定義されます。

関連する問題