我使用以下代码从我的wpf应用程序启动NServisBus.host.exe文件:
System.Diagnostics.Process.Start("NServiceBus.Host.exe");
我的NServiceBus主机有以下端点设置:
public class EndpointConfig : IConfigureThisEndpoint, AsA_Server
{
}
我的NServiceBus主机服务器上有以下类。我需要在我的wpf应用程序中创建这个类对象(在执行NServiceBus.host.exe之后)。
public class OrderMessaging
{
public IBus Bus { get; set; }
public void SendRouteMessageReceived(LabRoutingUpdateMessage routingUpdateMessage)
{
Bus.Send(new RouteMessageReceived(routingUpdateMessage));
}
}
然后我将通过它引用的dll文件(在我的wpf应用程序中)访问此消息类,并在我的wpf应用程序中使用以下代码向服务器发送消息:
OrderManagement.OrderMessaging routeMessageReceived = new OrderManagement.OrderMessaging();
routeMessageReceived.Bus = _bus; //Main problem is here! Wpf app does does not have handle on NServiceBus server Bus.
routeMessageReceived.SendRouteMessageReceived(_routing);
我是否可以使用WPF应用程序向我的NServiceBus.host.exe(使用process.start运行时)发送消息?有没有办法我可以使用自定义初始化在我的wpf应用程序中托管我自己的NServiceBus并仍然正确配置我的端点?或者有没有办法从我的wpf应用程序中获取总线处理? 非常感谢任何示例代码。提前谢谢!
答案 0 :(得分:2)
听起来您希望WPF应用程序访问NServiceBus.Host.exe托管端点中的确切Bus实例。如果这是真的,则表明您认为只有一个总线,而事实并非如此。
“总线”对您的终端很像以太网卡就是您的计算机。每台计算机都需要一个以太网卡,他们使用它们相互通信。同样,“总线”就像你的以太网卡。每个进程都有自己的进程,并使用它们向对方发送消息。
NServiceBus.Host.exe可以通过控制台窗口简化托管端点,也可以将其安装为Windows服务,以便始终运行并可用。您应该从不需要执行Process.Start()。它还使总线的配置非常简单 - 几乎是自动的。您不必执行复杂的Configure.With()...流畅配置位。
使用任何其他应用程序类型(Windows控制台应用程序,Windows窗体应用程序,WPF应用程序),您需要自己“托管”总线。这意味着执行整个流畅配置位并将生成的“IBus”实例分配给可以从该应用程序的任何部分访问的公共静态变量。 (在NServiceBus.Host版本中,您不必具有对总线的公共静态引用,因为主机将其创建为单例,并且依赖注入容器会将其插入到您创建的任何要求它的类中。)
一旦您的WPF应用程序和NServiceBus.Host.exe进程都启动并初始化了各自的总线,WPF应用程序的总线就可以向NServiceBus.Host.exe的总线发送消息。
答案 1 :(得分:1)
你想使用process.start听起来有点奇怪。为什么不把主机作为Windows服务运行并让它一直运行,以便它接收任何进来的消息?不过,如果进程正在运行并且它加载了消息处理程序,它应该处理消息。
当然,如果您将消息发送到充当主机输入队列的队列,只需发送到该队列。
我认为您在询问是否可以从wpf应用程序中使用主机应用程序中的总线实例,如果是这样,答案就是您不希望这样做。只需在wpf应用程序中创建一个总线实例。像nservicebus这样的东西的重点是通过不同的端点促进可靠的进程间通信。只是使用它。
您可以像在任何其他应用程序中一样在wpf应用程序中设置总线并使用它来发送消息。如果您希望wpf应用程序也处理消息,则需要为包含处理程序的程序集加载消息处理程序。