使用Bus Start方法或类构造函数来实例化服务使用的对象是否更好?

时间:2015-03-02 13:56:46

标签: nservicebus

我使用nServiceBus 5并创建了许多主机端点,其中两个端点侦听数据库更改。 (可以找到如何执行此操作的具体细节here)。目的是让后台运行一个服务,当数据库监听器通知时,使用总线发布事件消息。

创建数据库侦听器对象并处理事件的代码位于 Start 方法中,作为 IWantToRunWhenBusStartsAndStops 的一部分实现。

所以 - 这里的代码可能会在以后引起问题,例如,如果抛出异常(是的,我确实有try / catch块,但为了清楚起见,我从示例代码中删除了它们)? Start 方法完成执行后会发生什么?

我的 RequestNewQuoteSender 类上的构造函数是否会更好地将数据库侦听器实例化为类属性而根本不使用 Start 方法?

namespace MySample.QuoteRequest
{
    public partial class RequestNewQuoteSender : IWantToRunWhenBusStartsAndStops
    {
        public void Start() 
        { 
            var changeListener = new DatabaseChangeListener(_ConnectionString);

            // Assign the code within the braces to the DBListener's onChange event
            changeListener.OnChange += () =>
            {
                    // code to handle database change event

                    changeListener.Start(_SQLStatement);

            };

            // Now everything has been set up.... start it running.
            changeListener.Start(_SQLStatement);
        }

        public void Stop() { LogInfo("Service Bus has stopped"); }
    }
}

1 个答案:

答案 0 :(得分:1)

你的代码对我来说似乎没问题。 只是一些小事:

  • changeListener成为一个类字段,这样它就不会成为GC(不是100%确定它是否只是为了确保);
  • 取消订阅OnChange方法{/ 1}};
  • 您可能还想拥有一个"锁定"在Stop()changeListener.Start(_SQLStatement);附近,这样就没有比赛条件了(我把这个条件留给你来判断你是否需要它);

这有意义吗?