Я пытаюсь понять 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!");
}
}
}
Какую проблему вы на самом деле пытаетесь решить? –
Моим вариантом использования является то, что у меня есть общий сервис-хост, кэширующий каналы обратного вызова WCF. Хост службы не знает, какой тип контракта на обслуживание он кэширует. Я хочу создать прокси-серверы для фактического обратного вызова, чтобы я мог контролировать доступ и время жизни канала обратного вызова с учетом многопоточной среды. Возможность поменять местами по требованию позволит мне это сделать. Я сделал это со своими собственными классами, полученными из RealProxy. С RealProxy вы можете получить базовый класс прокси и вызывать методы на нем, как будто я хочу сделать с Castle. – Jim
Лицо, которое отклонено, объясните, что я могу сделать, чтобы улучшить вопрос. – Jim