【问题标题】:Castle Dynamic Proxy how to merge data in CreateClassProxyWithTargetCastle Dynamic Proxy 如何在 CreateClassProxyWithTarget 中合并数据
【发布时间】:2013-10-03 22:50:04
【问题描述】:

是否可以使用 Castle Dynamic Proxy 将代理功能添加到已生成且非空的对象?

我试过了:

Dog _myDog=new Dog();
_myDog.Name="Fuffy";

var _proxyDog = generator.CreateClassProxyWithTarget<Dog>(_myDog, ProxyGenerationOptions.Default, new DogInterceptor());

_proxyDog 结果为一个新对象。

现在这只是一个例子,在现实世界的应用程序中,我的对象有 30 多个属性,我想知道我是否可以避免一个一个地复制这些道具!

【问题讨论】:

  • 这是你自己的对象吗?你能为它创建一个接口吗? CreateInterfaceProxyWithTarget 工作正常。我已经在 IList 上进行了测试

标签: c# castle-dynamicproxy


【解决方案1】:

是的。唯一的问题:ProxyGenerator 无论如何都需要实例化该类型的对象。这段代码实际上在我的项目中工作正常:

public static class MongoExtensions
{
    static readonly ProxyGenerator pg = new ProxyGenerator();
    public static MongoCollection GetRetryCollection(this MongoDatabase db, string collectionName, int retryCount = 5, int pauseBetweenRetries = 2000)
    {
        var coll = db.GetCollection(collectionName);
        return (MongoCollection)pg.CreateClassProxyWithTarget(typeof(MongoCollection), coll, new object[] { db, collectionName, coll.Settings }, new RetryingInterceptor { RetryCount = retryCount, PauseBetweenCalls = pauseBetweenRetries });
    }
}

CreateClassProxyWithTarget 的参数是:

  • 代理对象的类型,
  • 代理实例
  • 代理类型的构造函数参数数组。
  • 此代理的拦截器。

我无法真正解释,为什么它需要对象的构造函数参数,但这段代码对我来说可以正常工作。

【讨论】:

  • 尝试使用Dog _proxyDog = (Dog)generator.CreateClassProxyWithTarget(typeof(Dog),_myDog, new object[] {}, new DogInterceptor());,但没有成功!结果对象始终为空。
  • 嗯,我得好好检查一下。也许它也不适合我。
【解决方案2】:

我遇到了同样的问题,所以使用 vlad 的建议这对我有用:

var _proxyDog = generator.CreateClassProxyWithTarget(_myDog.GetType(), _myDog, new DogInterceptor());

据我所知,创建了一个新的包装器(代理)来模拟真实的类,而包装的类(目标)是我的原始对象。

附加:不,我再次检查并且“目标类型”是正确的,但代理没有反映其中设置的值。我认为这是一个错误;还有一个大的。

从第一张图片中,您可以看到所有导入都满足的原始类。

图片在这里... 遗憾的是,我无法发布图片供您查看,因为看起来我需要“10”的声誉;显然。这有多傻?对不起。

您可以看到代理上的属性既为空又不完整,但“_target”下的原始类仍然完好无损。探测代理属性会导致异常行为,您不需要检查目标,因为您会避开装饰器的目的。

这里有另一张图片...

我希望所有属性都在那里完全模仿底层类;或者它们都不是,并且映射是动态的。就目前而言,它对我也不起作用,因为我真正想要访问的一个属性被暴露了一个不正确的值。

科林。

【讨论】:

    【解决方案3】:

    原始问题中的方法很好。但是,您需要确保被包装的类中的所有属性都标记为虚拟。

    【讨论】:

      猜你喜欢
      • 2011-10-03
      • 2013-11-08
      • 2023-03-21
      • 2018-01-30
      • 1970-01-01
      • 2011-09-05
      • 2012-06-01
      • 2011-10-01
      • 2011-10-24
      相关资源
      最近更新 更多