2013-07-29 2 views
0

Я пытаюсь понять DynamicProxy от Castle, и я бы хотел сделать, чтобы изменить цель сгенерированного прокси во время выполнения.Как изменить цель с помощью Castle DynamicProxy

Что-то вроде этого ...

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Castle.DynamicProxy; 

namespace ConsoleApplication16 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IFoo foo = new Foo("Foo 1"); 

      IFoo foo2 = new Foo("Foo 2"); 

      foo.DoSomething("Hello!"); 

      ProxyGenerator generator = new ProxyGenerator(); 
      IFoo proxiedFoo = generator.CreateInterfaceProxyWithTarget<IFoo>(foo); 

      proxiedFoo.DoSomething("Hello proxied!"); 

      (proxiedFoo as IChangeProxyTarget).ChangeProxyTarget(foo2); // cast results in null reference 

      proxiedFoo.DoSomething("Hello!"); 
     } 
    } 
} 

Я думал, что сгенерированный прокси будет осуществлять IChangeProxyTarget но приведение к результатам интерфейса в нулевой ссылке.

Как я могу изменить цель сгенерированного прокси во время выполнения?

Update Как упоминалось в ответе, я попытался с помощью CreateInterfaceProxyWithTargetInterface и я до сих пор не в состоянии бросить в IChangeProxyTarget сменить цель.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Castle.DynamicProxy; 

namespace ConsoleApplication16 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IFoo foo = new Foo("Foo 1"); 

      IFoo foo2 = new Foo("Foo 2"); 

      foo.DoSomething("Hello!"); 

      ProxyGenerator generator = new ProxyGenerator(); 
      IFoo proxiedFoo = generator.CreateInterfaceProxyWithTargetInterface<IFoo>(foo); 

      proxiedFoo.DoSomething("Hello proxied!"); 

      IChangeProxyTarget changeProxyTarget = proxiedFoo as IChangeProxyTarget; 

      if (changeProxyTarget == null) // always null... 
      { 
       Console.WriteLine("Failed"); 
       return; 
      } 

      changeProxyTarget.ChangeProxyTarget(foo2); 

      proxiedFoo.DoSomething("Hello!"); 
     } 
    } 
} 
+0

Какую проблему вы на самом деле пытаетесь решить? –

+0

Моим вариантом использования является то, что у меня есть общий сервис-хост, кэширующий каналы обратного вызова WCF. Хост службы не знает, какой тип контракта на обслуживание он кэширует. Я хочу создать прокси-серверы для фактического обратного вызова, чтобы я мог контролировать доступ и время жизни канала обратного вызова с учетом многопоточной среды. Возможность поменять местами по требованию позволит мне это сделать. Я сделал это со своими собственными классами, полученными из RealProxy. С RealProxy вы можете получить базовый класс прокси и вызывать методы на нем, как будто я хочу сделать с Castle. – Jim

+0

Лицо, которое отклонено, объясните, что я могу сделать, чтобы улучшить вопрос. – Jim

ответ

1

использование CreateInterfaceProxyWithTargetInterface

Это один позволит сменить цель прокси/вызова.

Также IChangeProxyTarget реализован по типу вызова, а не по самому прокси.

+0

Я пробовал это, и прокси-сервер до сих пор не может быть перенесен в IChangeProxyTarget Изменение IChangeProxyTargetProxyTarget = proxiedFoo как IChangeProxyTarget; if (changeProxyTarget == null) // всегда null ... { Console.WriteLine ("Failed"); возвращение; } – Jim

+0

см. Обновленный ответ –

+0

Таким образом, действительно невозможно изменить цель за пределами добавления перехватчика и изменить через объект-вызов ... – Jim

Смежные вопросы