gpt4 book ai didi

.net - 在 .NET Web 应用程序中使用 CaSTLe DynamicProxy 的性能建议

转载 作者:行者123 更新时间:2023-12-03 20:19:23 27 4
gpt4 key购买 nike

我从 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; }
    }

    }

    最佳答案

    缓存代理生成器的静态副本是线程安全的,您绝对应该这样做。这被认为是此 API 的最佳实践,不这样做会导致在新的动态程序集中无缘无故地定义额外的类型。

    关于.net - 在 .NET Web 应用程序中使用 CaSTLe DynamicProxy 的性能建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6302617/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com