【问题标题】:Castle interface proxy with a dynamic target具有动态目标的 Castle 接口代理
【发布时间】:2014-03-20 06:37:54
【问题描述】:

我正在尝试使用 Castle DynamicProxy 来实现 SignalR Hub 的类型安全版本。 目标是当我使用 Clients.All 而不是获取动态对象时,我有一个可以使用的接口。

目前的代码相当老套,但我想证明它会在我费尽周折把它弄好之前证明它可以工作:

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 并使用拦截器来连接对动态的调用。

【问题讨论】:

    标签: c# signalr signalr-hub castle-dynamicproxy


    【解决方案1】:

    你似乎在正确的轨道上。

    这是一个计划在 SignalR 2.1 中发布的功能。你可以在这里看看它是如何实现的:https://github.com/SignalR/SignalR/commit/3c4b8794b0f512daec677110a8e41ac717514584

    虽然可能有一种方法可以使用 Castle DynamicProxy 执行此操作,但使用 ImpromptuInterface 可能更简单。

    TypedClientBuilder&lt;T&gt;.Build(_dynamicContext...) 的每个调用都可以替换为Impromptu.ActLike&lt;T&gt;(_dynamicContext...)。在您的情况下,对 Impromptu.ActLike 的调用将替换 proxyGen.CreateInterfaceProxyWithTarget

    如果你真的很喜欢冒险,你可以试试SignalR nightlies from MyGet,它已经包含了这个功能。

    【讨论】:

    • 好的,如果我理解正确,如果我使用 Signal R 2.0,我只需要使用 ImpromptuInterface 解决方案。如果我使用 nightly 或等到 2.1 我会被覆盖?
    • Hub应该在 SignalR 2.1 中。我不相信任何发布日期尚未公布。
    • 很好,这更多是作为概念证明而不是实际功能,它完成的事实让我非常兴奋。我将能够重新访问我在 SO 上发布的其他接口代理并清理它。
    猜你喜欢
    • 2011-05-02
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多