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

在.NET Web应用程序中使用Castle DynamicProxy的性能建议,第1张

概述我开始使用Castle DynamicProxy,我有这个示例来跟踪对象属性的更改. 问题: >我应该缓存(在静态字段中)我在AsTrackable()中使用的ProxyGenerator()实例吗?我将在ASP.NET网络应用程序中使用,我不确定该类是否是线程安全的?创建起来很昂贵吗? >如果我保持代码不变,生成的代理类型是否会被不同的ProxyGenerator实例重用.我读了caching 我开始使用Castle DynamicProxy,我有这个示例来跟踪对象属性的更改.

问题:

>我应该缓存(在静态字段中)我在AsTrackable()中使用的proxygenerator()实例吗?我将在ASP.NET网络应用程序中使用,我不确定该类是否是线程安全的?创建起来很昂贵吗?
>如果我保持代码不变,生成的代理类型是否会被不同的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 Web应用程序中使用Castle DynamicProxy的性能建议全部内容,希望文章能够帮你解决在.NET Web应用程序中使用Castle DynamicProxy的性能建议所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1069550.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存