开始NServiceBus和依赖注入和实例

时间:2011-06-26 19:55:01

标签: c#-4.0 nservicebus

我有一些NServiceBus的问题,我可以让pubsub示例正常工作,但现在我正在尝试将它集成到一个生产项目中,我不能让它工作!

我的发布商代码与发布商示例完全相同(我刚刚导入项目以排除任何其他问题)但我创建了一个void函数并从我的WPF应用程序中调用它,我得到了一个“你不能调用总线而不创建总线实例“错误

 public void RunTest()
            {
                    var eventMessage = new MarketPriceMessage();
                    eventMessage.Ticker = "IBM";
                    eventMessage.DataType = "Bid";
                    eventMessage.Value = (decimal)23.23423;
                    eventMessage.EventId = Guid.NewGuid();
                    eventMessage.Time = DateTime.Now; // > 30 ? (DateTime?)DateTime.Now : null;
                    eventMessage.Duration = TimeSpan.FromSeconds(99999D);



                    Bus.Publish(eventMessage);
            }

关于那里发生什么以及我哪里出错的想法?​​

按照@ Adam的评论,这是我在WPF应用程序内部使用的代码:

    public partial class App : Application
{
    public IBus bus { get; set; }

     protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        NServiceBus.Configure.With()
               .Log4Net()
               .SpringBuilder()
               .XmlSerializer()
               .MsmqTransport()
               .UnicastBus()
               .LoadMessageHandlers()
               .CreateBus()
               .Start();
    }
}

}

namespace WpfApplication2
{
    class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher { }

}

namespace WpfApplication2
{
    public class SubscriptionAuthorizer : IAuthorizeSubscriptions
    {
        public bool AuthorizeSubscribe(string messageType, string clientEndpoint, string clientWindowsIdentity, IDictionary<string, string> headers)
        {
            return true;
        }

        public bool AuthorizeUnsubscribe(string messageType, string clientEndpoint, string clientWindowsIdentity, IDictionary<string, string> headers)
        {
            return true;
        }
    }
}

App Config

<configuration>
  <configSections>
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core"/>
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core"/>
  </configSections>

  <MsmqTransportConfig 
                       InputQueue="WpfApplication2InputQueue" 
                       ErrorQueue="error" 
                       NumberOfWorkerThreads="1" 
                       MaxRetries="5"/>
  <UnicastBusConfig>
    <!--DistributorControlAddress="" DistributorDataAddress="" ForwardReceivedMessagesTo="">-->
    <MessageEndpointMappings>
    </MessageEndpointMappings>
  </UnicastBusConfig>

当我单步执行代码时,我可以看到总线是一个空对象。

我将参考文献包括在内正常

2 个答案:

答案 0 :(得分:1)

我对WPF不太熟悉,但看起来有一个可能有效的Application.Startup事件。您需要“手动”配置总线,如docs

中所示

答案 1 :(得分:0)

如果您没有使用Autofac或其他容器,问题是您跳过了对总线变量的赋值。我通常将它放在Global.asax Application_Startup中,但这种方式也应该有效。

如果 使用容器,并且注册了实现ServiceContract的类,则可以在实例化时注入本地IBus构造函数/属性。

public IBus bus { get; set; }

protected override void OnStartup(StartupEventArgs e)
{
   base.OnStartup(e);

   bus = NServiceBus.Configure.With() // keep a reference to the returned bus. 
           .Log4Net()
           .SpringBuilder()
           .XmlSerializer()
           .MsmqTransport()
           .UnicastBus()
           .LoadMessageHandlers()
           .CreateBus()
           .Start();
}