gpt4 book ai didi

c# - 具有动态目标的 CaSTLe 接口(interface)代理

转载 作者:行者123 更新时间:2023-11-30 17:48:43 24 4
gpt4 key购买 nike

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

目前的代码相当hacky,但我想在我努力让它变得更好之前证明它可以工作:

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);
}

现在当我返回代理时它失败了,因为目标没有实现接口(interface)。

有没有一种简单的方法可以实现这个目标,或者我应该考虑使用 InterfaceProxyWithoutTarget 并使用拦截器来连接对动态的调用。

最佳答案

您似乎走在正确的轨道上。

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

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

每次调用 TypedClientBuilder<T>.Build(_dynamicContext...) 可以替换为 Impromptu.ActLike<T>(_dynamicContext...) .在您的情况下,调用 Impromptu.ActLike将取代 proxyGen.CreateInterfaceProxyWithTarget .

如果您真的很喜欢冒险,可以试试 SignalR nightlies from MyGet已经包含该功能。

关于c# - 具有动态目标的 CaSTLe 接口(interface)代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22518914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com