Я пытаюсь использовать Castle DynamicProxy для реализации типизированной версии SignalR Hub. Цель состоит в том, что когда я использую Clients. Вместо того, чтобы возвращать динамический объект, у меня есть интерфейс для использования.
Код на данный момент довольно хакерский, но я хотел доказать, что он будет работать, прежде чем я буду стараться сделать его красивым:
public interface IChatClient
{
void broadcastMessage(string name, string message);
}
public class ChatHub : TypeSafeHub<IChatClient>
{
public void Send(string name, string message)
{
Clients.All.broadcastMessage(name, message);
}
}
public abstract class TypeSafeHub<TInterface> : Hub where TInterface:class
{
public new TypeSafeHubCallerConnectionContext<TInterface> Clients
{
get
{
return new TypeSafeHubCallerConnectionContext<TInterface>(base.Clients);
}
}
}
public class TypeSafeHubCallerConnectionContext<T> where T:class
{
private IHubCallerConnectionContext context;
private ProxyGenerator proxyGen;
public TypeSafeHubCallerConnectionContext(IHubCallerConnectionContext context)
{
this.context = context;
proxyGen= new ProxyGenerator();
}
public T All
{
get
{
return proxyGen.CreateInterfaceProxyWithTarget<T>(context.All);
}
Прямо сейчас, когда я возвращаю прокси, он терпит неудачу, потому что цель не реализует интерфейс.
Есть ли простой способ достичь этой цели, или я должен посмотреть на использование InterfaceProxyWithoutTarget и использование перехватчика для подключения вызова к динамическому.