Castle'ın Dinamik Proxy'sini kullanırken biraz (tuhaf olduğunu düşündüğüm) garip davranışlara rastladım. Aşağıdaki kod ileKale Dinamik Proxy, sınıfın içinden çağrıldığında yöntem çağrılarını engellemiyor
:
class Program
{
static void Main(string[] args)
{
var c = new InterceptedClass();
var i = new Interceptor();
var cp = new ProxyGenerator().CreateClassProxyWithTarget(c, i);
cp.Method1();
cp.Method2();
Console.ReadLine();
}
}
public class Interceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine(string.Format("Intercepted call to: " + invocation.Method.Name));
invocation.Proceed();
}
}
public class InterceptedClass
{
public virtual void Method1()
{
Console.WriteLine("Called Method 1");
Method2();
}
public virtual void Method2()
{
Console.WriteLine("Called Method 2");
}
}
ben çıkışını almak için bekliyordum:
- Yakalayan çağrı için: Yöntemi1 Yöntem 1 Aranan
- Yakalayan çağrı için: Method2
- Yöntem 2
- Intercepted çağrı için: 2
Ancak ne var Yöntem Aranan Method2
- Yakalayan çağrı için: Method1 Yöntem 1 Aranan
- Yöntem 2 Aranan
- Aşağıdaki çağrıya çağrılır: Yöntem2
- Yöntem 2
Anlatabildiğim kadarıyla, proxy yönteminin yalnızca proxy metodu çağrıları, aramanın Program2 den çağrıldıkça ancak InterceptedClass içinden değil, Method2'nin araya girmesi nedeniyle sınıfın dışından gelmesi durumunda gerçekleştirilebilir.
Vekil olan sınıf içinde arama yaparken, artık vekilden geçmeyeceğini, ancak sadece bunun beklendiğini kontrol etmek istediğini ve eğer varsa, o zaman var olup olmadığını görmek isteyip istemediğinizi anlayabilirim. Aradıkları yerden bağımsız olarak aramalar kesiliyor mu?
Teşekkür
Yep hakkında hiçbir şey bilmeden, ben ne beklenir kesinlikle var, ben tür çok düşündüm. Yani diğer terimlerle "cp" çağrıları kesişebilir ve "c" ye çağrı yapamaz ve "c" den "c" ye çağrıları içerir - ki bu hiç de şaşırtıcı değildir. Bir kenara göre: Soru sorduğumda biraz daha açıklayıcı değişken isimleri kullanmayı düşünmeliyim, ha? Güncelleme için –
Teşekkür - CreateClassProxyWithTarget kullanarak nedeni gerçek problemde ben o zaman vekil sarmalamak istediğiniz bir IoC konteyner tarafından oluşturulan hedef nesne çözmeye çalışıyorum olmasıdır. Ancak bu sorun, bu sorunun kapsamı dışındadır. Yardım ettiğin için teşekkür ederim. –
@George: Kale Dinamik Proxy'sini kullanmak için IoC konteynerini ikna etmenin herhangi bir yolu var mı? Söylediğin gibi, bu sorudan biraz ayrı, ama bu yapılabilir ... –