gpt4 book ai didi

c# - 需要在消息处理程序中引用的全局对象

转载 作者:行者123 更新时间:2023-12-02 01:09:58 25 4
gpt4 key购买 nike

我有一个 signalr 客户端,我想全局化。

我认为最好在端点配置的 Init() 中创建信号器客户端。

public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization
{
public static HubConnection hubConnection;
public static IHubProxy hubProxy;

public void Init()
{
Configure.With()
.DefiningEventsAs(t => t.Namespace != null && t.Namespace.Contains(".Events."))
.DefiningMessagesAs(t => t.Namespace != null && t.Namespace.Contains(".Messages."))
.StructureMapBuilder(new Container(new DependencyRegistry()));

Configure.Serialization.Json();

hubConnection = new HubConnection("http://localhost:58120");
hubProxy = hubConnection.CreateHubProxy("AmsHub");
hubProxy.On<string>("receiveServerPush", x => System.Diagnostics.Debug.WriteLine(x));
hubConnection.Start().Wait();
}

public class DependencyRegistry : Registry
{
public DependencyRegistry()
{
Scan(x =>
{
x.AssembliesFromApplicationBaseDirectory();
x.ExcludeNamespace("StructureMap");
x.WithDefaultConventions();
});
}
}
}

我感到困惑的是,我应该如何在消息处理程序中引用 hubConnection 和 hubProxy?我好像在偷偷操纵 NServicebus。

public class TestHandler : IHandleMessages<AMS.Infrastructure.Events.IEvent>
{
public void Handle(AMS.Infrastructure.Events.IEvent message)
{
EndpointConfig.hubProxy.Invoke("ServerFunction", "yodle");
}
}

PS:我需要连接和代理是全局的原因是因为根据信号员的说法,产生一个新的 hubConnection 是昂贵的。他们强烈反对一遍又一遍地创建和销毁集线器连接。他们发现使 hubconnection 全局/静态(?)没问题。

最佳答案

在这种情况下,您的集线器连接/代理实际上与 EndPointConfiguration 类无关。它们不使用也不需要任何此类数据来运行。

我建议将它们放在它们自己的惰性初始化单例中,并在第一次访问时自动启动它们。这看起来像:

public class Hub
{
private static Lazy<Hub> instance = new Lazy<Hub>(() => new Hub());

public static Hub Instance { get { return instance.Value; } }

private Hub()
{
this.Connection = new HubConnection("http://localhost:58120");
this.Proxy = Connection.CreateHubProxy("AmsHub");
this.Proxy.On<string>("receiveServerPush", x => System.Diagnostics.Debug.WriteLine(x));
this.Connection.Start().Wait();
}

public HubConnection Connection { get; private set; }
public IHubProxy Proxy { get; private set; }
}

然后您的消费者只需使用:

public class TestHandler : IHandleMessages<AMS.Infrastructure.Events.IEvent>
{
public void Handle(AMS.Infrastructure.Events.IEvent message)
{
Hub.Instance.Proxy.Invoke("ServerFunction", "yodle");
}
}

这样做的好处是在第一次使用之前不创建和启动,并将这种类型隔离到它自己的类中。

鉴于您还在内部处理订阅,您还可以选择封装您的方法以简化使用:

public class Hub
{
private static Lazy<Hub> instance = new Lazy<Hub>(() => new Hub());

public static Hub Instance { get { return instance.Value; } }

private Hub()
{
this.Connection = new HubConnection("http://localhost:58120");
this.Proxy = Connection.CreateHubProxy("AmsHub");
this.Proxy.On<string>("receiveServerPush", x => System.Diagnostics.Debug.WriteLine(x));
this.Connection.Start().Wait();
}

private HubConnection Connection { get; set; }
private IHubProxy Proxy { get; set; }

public static Task Invoke(string method, params Object[] args)
{
return Instance.Proxy.Invoke(method, args);
}

public static Task<T> Invoke<T>(string method, params Object[] args)
{
return Instance.Proxy.Invoke<T>(method, args);
}
}

有了上面的内容,您可以只使用:Hub.Invoke("ServerFunction", "yodle");

关于c# - 需要在消息处理程序中引用的全局对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18282756/

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