城堡动态代理如何合并数据在CreateClassProxyWithTarget
本文关键字:合并 数据 CreateClassProxyWithTarget 动态 代理 何合并 城堡 | 更新日期: 2023-09-27 17:54:43
是否可以使用Castle动态代理将代理功能添加到已经生成的非空对象?
我试过了:
Dog _myDog=new Dog();
_myDog.Name="Fuffy";
var _proxyDog = generator.CreateClassProxyWithTarget<Dog>(_myDog, ProxyGenerationOptions.Default, new DogInterceptor());
_proxyDog
结果为新对象。
现在这只是一个例子,在现实世界的应用程序中,我的对象有30多个属性,我想知道我是否可以避免一个接一个地复制这些道具!
是的。唯一的问题是:无论如何,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的参数为:
- 被代理对象的类型, <
- 代理实例/gh> 被代理类型的构造函数参数数组。
我真的不能解释,为什么它需要对象的构造函数参数,但这段代码对我来说工作正确。
我有同样的问题,所以使用vlad的建议这对我有用:
var _proxyDog = generator.CreateClassProxyWithTarget(_myDog.GetType(), _myDog, new DogInterceptor());
从我所看到的,创建了一个新的包装器(代理)来模拟真实的类,而包装的类(目标)是我的原始对象。
我又检查了一次,"目标类型"是正确的,但代理没有反映其中设置的值。我认为这是一个bug;一个大的。 从第一个图像中,您可以看到满足所有导入的原始类。图像在这里……遗憾的是,我不能发布图片给你看,因为看起来我需要一个"10"的声誉;显然。这有多愚蠢?对不起。
如您所见,代理上的属性既为空又不完整,但'_target'下的原始类仍然完整。探测代理的属性会导致异常的行为,你不需要检查目标,因为你会消除装饰器的目的。
另一张图片…
我希望所有的属性都在那里完全模仿底层类;或者都没有,映射是动态的。就目前而言,它对我也不起作用,因为我真正想要访问的一个属性被暴露为不正确的值。
科林。原问题中的方法很好。但是,您需要确保被包装的类中的所有属性都被标记为virtual。